android – RecyclerView消失的图像

前端之家收集整理的这篇文章主要介绍了android – RecyclerView消失的图像前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想要创建的是一个水平滚动图库.我有一个RecyclerView(支持22.0.0).我遇到的问题是,当我滚动到最后然后向后滚动时,通常会丢失一个图像,有时会丢失两个图像.奇怪的是,当我不停地来回扫动时,可能会丢失不同的图像.这是项目的布局:
  1. <LinearLayout
  2. xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="160dp">
  5.  
  6. <ImageView
  7. android:id="@+id/product_variation_image"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. android:scaleType="centerCrop"
  11. android:layout_gravity="center"/>

这是Adaper:

  1. public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> {
  2. private String[] mDataset;
  3.  
  4. public static class ViewHolder extends RecyclerView.ViewHolder {
  5.  
  6. public ImageView mImageView;
  7. public ViewHolder(View v) {
  8. super(v);
  9. mImageView = (ImageView) v.findViewById(R.id.product_variation_image);
  10. }
  11. }
  12.  
  13. public TestAdapter(String[] myDataset) {
  14. mDataset = myDataset;
  15. }
  16.  
  17. @Override
  18. public TestAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
  19. // create a new view
  20. View v = LayoutInflater.from(parent.getContext())
  21. .inflate(R.layout.variaton_list_item,parent,false);
  22. ViewHolder vh = new ViewHolder(v);
  23. return vh;
  24. }
  25.  
  26. @Override
  27. public void onBindViewHolder(ViewHolder holder,int position) {
  28.  
  29. holder.mImageView.setImageDrawable(null);
  30. String url = mDataset[position];
  31. Log.i("TEST","position = " + position);
  32. ((MainActivity)MainActivity.getInstance()).imageDownloader.download(url,holder.mImageView);
  33. }
  34.  
  35. @Override
  36. public int getItemCount() {
  37. return mDataset.length;
  38. }

下载方法从URL获取图像,或者如果已经缓存,则从内存中获取图像.这适用于所有其他布局,例如ListView或GridView.这是我在片段中设置它的代码

  1. final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
  2. layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
  3. mRecyclerView.setLayoutManager(layoutManager);

这是在onCreateView方法中.当我获取网址时,我填充它们并使用以下方法设置适配器:

  1. myDataset[i] = imageURL; // for each image
  2. mAdapter = new TestAdapter(myDataset);
  3. mRecyclerView.setAdapter(mAdapter);

有趣的是适配器中onBindViewHolder方法中的行,我记录位置.我发现没有显示图像的单元格是没有调用方法.就像它出于某种原因跳过那个细胞一样.更奇怪的是,如果我按住一个单元格并继续从左向右滑动,如果一个单元格离开屏幕然后又重新进入,那么它的图像就会再次被调用onBindViewHolder方法.

解决方法

我认为不重要的一个类是造成这个问题的一个类.我不确定是什么原因,但它存在于我用于从BitmapFun示例获得的回收的自定义ImageView类中.
  1. public class RecyclingImageView extends ImageView {
  2.  
  3. public RecyclingImageView(Context context) {
  4. super(context);
  5. }
  6.  
  7. public RecyclingImageView(Context context,AttributeSet attrs) {
  8. super(context,attrs);
  9. }
  10.  
  11. /**
  12. * @see android.widget.ImageView#onAttachedToWindow()
  13. */
  14. @Override
  15. protected void onAttachedToWindow() {}
  16.  
  17. /**
  18. * @see android.widget.ImageView#onDetachedFromWindow()
  19. */
  20. @Override
  21. protected void onDetachedFromWindow() {
  22. // This has been detached from Window,so clear the drawable
  23.  
  24. setImageDrawable(null);
  25.  
  26. super.onDetachedFromWindow();
  27. }
  28.  
  29. /**
  30. * @see android.widget.ImageView#setImageDrawable(android.graphics.drawable.Drawable)
  31. */
  32. @Override
  33. public void setImageDrawable(Drawable drawable) {
  34. // Keep hold of prevIoUs Drawable
  35. final Drawable prevIoUsDrawable = getDrawable();
  36.  
  37. // Call super to set new Drawable
  38. super.setImageDrawable(drawable);
  39.  
  40. // Notify new Drawable that it is being displayed
  41. notifyDrawable(drawable,true);
  42.  
  43. // Notify old Drawable so it is no longer being displayed
  44. notifyDrawable(prevIoUsDrawable,false);
  45. }
  46.  
  47. /**
  48. * Notifies the drawable that it's displayed state has changed.
  49. *
  50. * @param drawable
  51. * @param isDisplayed
  52. */
  53. private static void notifyDrawable(Drawable drawable,final boolean isDisplayed) {
  54. if (drawable instanceof RecyclingBitmapDrawable) {
  55. // The drawable is a CountingBitmapDrawable,so notify it
  56. ((RecyclingBitmapDrawable) drawable).setIsDisplayed(isDisplayed);
  57. } else if (drawable instanceof LayerDrawable) {
  58. // The drawable is a LayerDrawable,so recurse on each layer
  59. LayerDrawable layerDrawable = (LayerDrawable) drawable;
  60. for (int i = 0,z = layerDrawable.getNumberOfLayers(); i < z; i++) {
  61. notifyDrawable(layerDrawable.getDrawable(i),isDisplayed);
  62. }
  63. }
  64. }
  65.  
  66. }

当我用普通的ImageView替换它时,我不再遇到问题.

猜你在找的Android相关文章