【发布时间】:2013-10-15 03:18:45
【问题描述】:
背景
我正在使用PinterestLikeAdapterView library 显示来自互联网的一些图像,这类似于gridView,但每个单元格的高度不同。
问题
由于我使用这个库来显示来自互联网的图像,因此在调用 notifyDatasetChanged 时不会导致视图混乱是至关重要的。
由于某种原因,调用此函数会调用 getView() 方法,并为视图提供不同的位置。例如,即使我根本没有滚动,并调用 notifyDatasetChanged(或 addAll,如果它是一个 ArrayAdapter),对于位置 0,它将采用位置 8 的视图,对于位置 1,它将采用位置视图7 等等……
这会使整个网格刷新其图像,因此会破坏用户体验。
通常,在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
...
}
但是,在这里他们以不同的顺序重用其他视图,所以这个技巧在这里不起作用。
由于这个问题,我不仅刷新了几乎所有可见视图,而且由于我使用DiskCacheLru library,它会崩溃,因为它尝试使用 2 个线程将 2 个相同的 inputSteam 数据放入同一个键中。
问题
我能做什么? 这是库中的已知错误吗?
也许我使用了一种不好的方法来克服刷新?
目前,我使用内存缓存来至少获取之前缓存的项目,但这更像是“治愈”而不是“疫苗”...
【问题讨论】:
-
你的意思是视图顺序很乱?
-
是和不是。网格以某种方式很好地显示了它们。只是它以奇怪的顺序调用适配器。也许我没有很好地解释这个例子:即使我根本没有滚动,并且我调用了 notifyDataSetChanged() ,getView 方法将调用位置 0 并给我位置 8 的视图而不是真实的视图用于位置 0。问题是正因为如此,我无法克服视图的刷新,所以看起来它重新加载了图像。我认为内存缓存可能会有所帮助,但这并不能真正解决这个问题,因为可能还有其他我没有考虑过的情况。
-
我一直以为
notifyDataSetChanged之后,你不会在getView得到旧的convertViews了。 -
@SherifelKhatib 它也会在这里得到它,但是以一种奇怪的方式 - 对于每个位置,您都会得到错误的视图,因此当它已经与该位置匹配时,您不能使用它的旧状态。这意味着在这种情况下,单元格的更新是不可避免的。
-
获得不同的视图是完全正常的,但我认为它们应该为空。试试这个技巧: 1- 在里面覆盖
getViewTypeCount()和return getCount();。 2- 覆盖其中的getItemViewType(int position)和return position;。
标签: android android-gridview pinterest notifydatasetchanged