Volley ImageRequest 不会总是用 ViewPagerAdapter 中的图像替换进度微调器

Volley ImageRequest won't always replace progress spinner with image inside ViewPagerAdapter

我希望能够将图像加载到带有 volley 和进度微调器的 ViewPager 中。

我的问题是有时会显示图像,有时会一直显示进度条。通常,如果加载图像的时间少于一秒,它就会正确加载并显示图像,否则如果需要更长的时间,进度微调器将永远持续下去。

这是我在 instantiateItem 方法中的 PagerAdapter 代码:

    @Override
public Object instantiateItem(ViewGroup container, int position) {
    LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    viewGroup = container;

    view = inflater.inflate(R.layout.photo_pager_layout, container, false);
    progressLayout = (LinearLayout) view.findViewById(R.id.photoProgress);

    imageView  = (TouchImageView) view.findViewById(R.id.photo);
    RequestQueue queue = Volley.newRequestQueue(activity);
    Display display = activity.getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);

    String url = photos.get(position).getPhotoUrl();
    url = url.replaceAll(activity.getString(R.string.flickr_photo_link_fifth), activity.getString(R.string.flickr_photo_link_sixth));

    progressLayout.setVisibility(View.VISIBLE);
    imageView.setVisibility(View.GONE);

    ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
        @Override
        public void onResponse(Bitmap response) {
            progressLayout.setVisibility(View.GONE);
            imageView.setVisibility(View.VISIBLE);
            imageView.setImageBitmap(response);


        }
    }, 1600, 1600, ImageView.ScaleType.FIT_XY, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
            progressLayout.setVisibility(View.GONE);
        }
    });
    queue.add(imageRequest);
    container.addView(view);

    return view;
}

感谢任何帮助,谢谢。

所以,我努力寻找了一段时间,效果非常好!

  1. 我使用 Universal Image Loader 来加载图像。您可以在这里找到它:https://github.com/nostra13/Android-Universal-Image-Loader,要将它添加到您的项目中,您需要将此行添加到您的 Build.Gradle 文件中:

    编译'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

  2. 我用了Fresco(by Facebook)的ZoomableDraweeView的扩展来hold住图片,发现缩放还是不行,于是又深入看了下。它对于保存加载的照片仍然非常有用,所以我将 post 放在这里:https://github.com/ibosong/CommentGallery/tree/master/frescozoomablelib/,你可以将它添加到你的 Build.Gradle 依赖项中以使用它:

    编译'com.github.ibosong.CommentGallery:frescozoomablelib:1.0.1'

  3. 我在这里找到了一个 PhotoViewAttacher,它非常适合放大和缩小照片:https://github.com/chrisbanes/PhotoView,您可以将其添加到 Build.Gradle 依赖项中以使用它:

    编译'com.commit451:PhotoView:1.2.4'

    您还需要将其添加到您的 Build.Gradle 存储库中:

    maven { url 'https://jitpack.io' }

我可以确认这与 ViewPager 一起工作得很好,实现如下 posted:

PhotoPagerActivity:

private PhotoPagerAdapter mAdapter;
private ViewPager mPager;
private Activity activity;
private DisplayImageOptions options;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.photo_pager_activity);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    // Show the Up button in the action bar.
    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

    activity = this;

    options = new DisplayImageOptions.Builder()
            .resetViewBeforeLoading(true)
            .imageScaleType(ImageScaleType.EXACTLY)
            .bitmapConfig(Bitmap.Config.RGB_565)
            .considerExifParams(true)
            .displayer(new FadeInBitmapDisplayer(300))
            .build();

    Bundle extras = getIntent().getExtras();
    int position = extras.getInt("pos");
    String title = extras.getString("AlbumTitle");
    setTitle(title);

    ArrayList<Photo> photos = PhotoAlbumActivity.getPhotos();
    mPager = (ViewPager) findViewById(R.id.photoPager);
    mAdapter = new PhotoPagerAdapter(photos, activity, options);
    mPager.setAdapter(mAdapter);
    mPager.setCurrentItem(position);
}

PhotoPagerAdapter:

private ArrayList<Photo> images;
private View v;
private LayoutInflater inflater;
private ZoomableDraweeView mImageView;
private Activity activity;
private ImageLoader imageLoader;
private DisplayImageOptions options;

PhotoPagerAdapter(ArrayList<Photo> images, Activity activity, DisplayImageOptions options) {
    super();
    this.images = images;
    this.activity = activity;
    ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(activity).build();
    ImageLoader.getInstance().init(configuration);
    imageLoader = ImageLoader.getInstance();
    this.options = options;
}

@Override
public Object instantiateItem(final ViewGroup container, int position) {
    inflater = LayoutInflater.from(activity);
    v = inflater.inflate(R.layout.photo_pager_layout, container, false);

    String url = images.get(position).getPhotoUrl().replaceAll(activity.getString(R.string.flickr_photo_link_fifth), activity.getString(R.string.flickr_photo_link_sixth));
    mImageView = (ZoomableDraweeView) v.findViewById(R.id.photo);
    PhotoViewAttacher pAttacher;
    pAttacher = new PhotoViewAttacher(mImageView);
    pAttacher.update();


    imageLoader.displayImage(url, mImageView, options, new SimpleImageLoadingListener() {
        @Override
        public void onLoadingStarted(String imageUri, View view) {

        }

        @Override
        public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
            String message = null;
            switch (failReason.getType()) {
                case IO_ERROR:
                    message = "Input/Output error";
                    break;
                case DECODING_ERROR:
                    message = "Image can't be downloaded";
                    break;
                case NETWORK_DENIED:
                    message = "Downloads are denied";
                    break;
                case OUT_OF_MEMORY:
                    message = "Out Of Memory error";
                    break;
                case UNKNOWN:
                    message = "Unknown error";
                    break;
            }

            Toast.makeText(v.getContext(), message, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        }
    });

    container.addView(v, 0);
    return v;
}

和photo_pager_layout:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="1dp">

    <ProgressBar
        android:id="@+id/pbHeaderProgress"
        style="@style/SpinnerAsEditText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"/>

    <com.bosong.frescozoomablelib.zoomable.ZoomableDraweeView
        android:id="@+id/photo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:scaleType="fitXY"
        android:layout_gravity="center"/>

</FrameLayout>

activity 的布局只包含一个 viewpager 和其他一些不重要的东西。希望这对某人有所帮助!