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数据放入同一个键中.
我能做什么?这是库中的已知错误吗?
也许我用一种糟糕的方法来克服刷新?
现在,我使用内存缓存至少获得之前缓存的项目,但这更像是一种"治疗"而不是"疫苗"......
View getView(int position, View view, ViewGroup parent)
之后将始终按升序调用notifyDataSetChanged()
。
我猜想,完成下载任务的顺序会导致这个问题。
正如您在问题中提到的,保留职位是避免此问题的好方法。
这是另一种解决方法,也是重新使用图像视图。
ImageView
保留每个下载任务的弱引用。
然后将下载任务包装在一个 dummy 中ColorDrawable
。
调用时getView
,将虚拟设置ColorDrawable
为ImageView
,然后开始下载。下载完成后,将下载的图像设置回引用的图像ImageView
图像OnPostExecute()
。
说明
http://android-developers.blogspot.jp/2010/07/multithreading-for-performance.html
源代码
https://code.google.com/p/android-imagedownloader/source/checkout
归档时间: |
|
查看次数: |
3527 次 |
最近记录: |