android - ViewPager + Picasso + 来自 URL 字符串数组的多个图像

标签 android android-viewpager picasso android-photoview

请帮助我。我正在关注 Chris Banes (https://github.com/chrisbanes/PhotoView) 的示例 PhotoView 中的示例 ViewPagerActivity,并且我想使用 Picasso URL 图像更改可绘制对象。因此,我尝试通过 Picasso 网址字符串数组将多个图像放入 HackyViewPager 中。

我的 xml ViewPager:

<my.package.HackyViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="200dp" />

在 onCreate 中:

...      
ViewPager viewPager = (HackyViewPager) findViewById(R.id.view_pager);
viewPager.setAdapter(new SamplePagerAdapter());

我有一个从单个 String stringDefinitionGemstonesPhoto 获取的 URL 字符串数组

String[] strAry = stringDefinitionGemstonesPhoto.split(",");

SamplePageAdapter 中的最终代码是:

static class SamplePagerAdapter extends PagerAdapter {

    private String stringDefinitionGemstonesPhoto = ("https://geology.com/minerals/photos/calcite-marble-127.jpg, https://geology.com/minerals/photos/calcite-concrete.jpg");
    private  String[] strAry = stringDefinitionGemstonesPhoto.split(",");


    @Override
    public int getCount() {
        return strAry.length;
    }

    @Override
    public View instantiateItem(ViewGroup container, int position) {
        PhotoView photoView = new PhotoView(container.getContext());

        System.out.println(strAry[position]);
        Picasso.get().load(strAry[position]).into(photoView);

        container.addView(photoView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        return photoView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

}

仅显示一张图像,当我滑动时,下一张照片为空/空白。在日志系统中打印出正确分割的链接。 怎么了?

最佳答案

我发现有什么问题,那就是

for(int i= 0; i < numbers.length; i++){
                System.out.println(strAry[i]);
                System.out.println(strAry[position]);
                Picasso.get().load(strAry[position]).into(photoView);
            }

应该是

            System.out.println(strAry[position]);
            Picasso.get().load(strAry[position]).into(photoView);

更新

我发现 PicassoGlideinstantiateItem() 中无法正常工作的问题,see more

所以我的解决方案不再使用上面的lib,我们尝试手动请求url,由于性能问题,这种方式并没有更好,但它有效。

这是我的解决方案

class SamplePagerAdapter extends PagerAdapter {

    private String stringDefinitionGemstonesPhoto = ("https://geology.com/minerals/photos/calcite-marble-127.jpg, https://geology.com/minerals/photos/calcite-concrete.jpg");
    private String[] strAry = stringDefinitionGemstonesPhoto.split(",");


    @Override
    public int getCount() {
        return strAry.length;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        PhotoView photoView = new PhotoView(container.getContext());
        try {
            new DownloadImageTask(photoView)
                    .execute(strAry[position]);
        } catch (Exception ex) {
            Log.e("Error", ex.getMessage());
        }

        container.addView(photoView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        return photoView;
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView((View) object);
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == object;
    }

    public class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
        private ImageView bmImage;

        DownloadImageTask(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            String urlDisplay = urls[0];
            Bitmap myImage = null;
            try {
                InputStream in = new java.net.URL(urlDisplay).openStream();
                myImage = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return myImage;
        }

        protected void onPostExecute(Bitmap result) {
            bmImage.setImageBitmap(result);
        }
    }
}

关于android - ViewPager + Picasso + 来自 URL 字符串数组的多个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53718278/

相关文章:

android - 如何在 Motorola Xoom 上进行屏幕截图?

android - "Activity has been destroyed"有时在用 fragment 填充 viewpager 时

Android - 多个可查看项目的水平滚动

android - picasso 不会加载谷歌静态 map

java - 在 Samsung Galaxy S 中添加 300 个联系人到组时出现 StringIndexOutOfBoundsException

android - 将 MediatorLiveData 迁移到 SharedFlow

android - 使用 Glide 在 RecyclerView 中加载图像时,UI 滞后且不稳定

java - Android 获取固定选项卡、PageViewer 来加载不同的 fragment

android - 在 RecyclerView 中滚动时图像闪烁

android - OutOfMemory 异常 - 对于 adapter.notifiyDataSetChanged() 在使用 picasso 加载图像时