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;
}
感谢任何帮助,谢谢。
所以,我努力寻找了一段时间,效果非常好!
我使用 Universal Image Loader 来加载图像。您可以在这里找到它:https://github.com/nostra13/Android-Universal-Image-Loader,要将它添加到您的项目中,您需要将此行添加到您的 Build.Gradle 文件中:
编译'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
我用了Fresco(by Facebook)的ZoomableDraweeView的扩展来hold住图片,发现缩放还是不行,于是又深入看了下。它对于保存加载的照片仍然非常有用,所以我将 post 放在这里:https://github.com/ibosong/CommentGallery/tree/master/frescozoomablelib/,你可以将它添加到你的 Build.Gradle 依赖项中以使用它:
编译'com.github.ibosong.CommentGallery:frescozoomablelib:1.0.1'
我在这里找到了一个 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 和其他一些不重要的东西。希望这对某人有所帮助!
我希望能够将图像加载到带有 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;
}
感谢任何帮助,谢谢。
所以,我努力寻找了一段时间,效果非常好!
我使用 Universal Image Loader 来加载图像。您可以在这里找到它:https://github.com/nostra13/Android-Universal-Image-Loader,要将它添加到您的项目中,您需要将此行添加到您的 Build.Gradle 文件中:
编译'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
我用了Fresco(by Facebook)的ZoomableDraweeView的扩展来hold住图片,发现缩放还是不行,于是又深入看了下。它对于保存加载的照片仍然非常有用,所以我将 post 放在这里:https://github.com/ibosong/CommentGallery/tree/master/frescozoomablelib/,你可以将它添加到你的 Build.Gradle 依赖项中以使用它:
编译'com.github.ibosong.CommentGallery:frescozoomablelib:1.0.1'
我在这里找到了一个 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 和其他一些不重要的东西。希望这对某人有所帮助!