如何在为PinterestLikeAdapterView调用notifyDataSetChanged()时避免刷新单元格?

and*_*per 7 android android-gridview pinterest notifydatasetchanged

背景

我正在使用PinterestLikeAdapterView库来显示来自互联网的一些图像,这类似于gridView但每个单元格的高度不同.

问题

由于我使用此库来显示来自互联网的图像,因此调用notifyDatasetChanged时不会导致视图混乱至关重要.

出于某种原因,调用此函数会调用具有不同位置的getView()方法.例如,即使我根本没有滚动,并调用notifyDatasetChanged(或者addAll,以防它是ArrayAdapter),对于位置0,它将采取位置8的视图,对于位置1,它将采取位置视图7,依此类推......

这使整个网格刷新其图像,因此它破坏了UX.

通常,在gridView和listView中,克服刷新的方法是将用于视图的位置放在viewHolder中,如果它们相等,则表示它们仍然匹配.

例如:

... getView(...)
  {
  //<=inflate a new view if needed 
  //avoid refreshing view in case it's still the same position:
  if(position==holder.position)
    return rootView;
  holder.position=position;
  //<=update the view according to its data
  ...
  }
Run Code Online (Sandbox Code Playgroud)

但是,这里他们以不同的顺序重用其他视图,所以这个技巧在这里不起作用.

由于这个问题,我不仅刷新了几乎所有可见的视图,而且因为我使用DiskCacheLru库,它崩溃了,因为它试图使用2个线程将2个相同的inputSteam数据放入同一个键中.

这个问题

我能做什么?这是库中的已知错误吗?

也许我用一种糟糕的方法来克服刷新?

现在,我使用内存缓存至少获得之前缓存的项目,但这更像是一种"治疗"而不是"疫苗"......

Zhe*_*ang 1

View getView(int position, View view, ViewGroup parent)之后将始终按升序调用notifyDataSetChanged()
我猜想,完成下载任务的顺序会导致这个问题。
正如您在问题中提到的,保留职位是避免此问题的好方法。

这是另一种解决方法,也是重新使用图像视图。

ImageView保留每个下载任务的弱引用。
然后将下载任务包装在一个 dummy 中ColorDrawable
调用时getView,将虚拟设置ColorDrawableImageView,然后开始下载。下载完成后,将下载的图像设置回引用的图像ImageView图像OnPostExecute()

说明
http://android-developers.blogspot.jp/2010/07/multithreading-for-performance.html
源代码
https://code.google.com/p/android-imagedownloader/source/checkout