我正在使用列表视图,并且我正在使用View holder模式和回收视图。所有工作都很棒并且符合预期。列表顺利滚动,除了一件事,我对实现非常满意。
我希望保留最后3个在屏幕上滚动的视图,然后才能让他们的视图回收。我想这样做是为了实现以下目标。我的列表中有图像,并且我异步加载它们并且它们有一些淡入淡出的动画。只要用户滚动到新项目,这一切都很好,但我希望如果用户再次向后滚动,图像将已经填充并且不会再次加载。当然,我不希望所有以前的视图都保存,但最后几个项目(比方说三个)是合理的。
关于如何实现它的任何想法?
由于
- 编辑 -
回答一些意见。淡入效果对问题没有影响(它更容易识别它)没有淡入,图像只是出现,但用户会看到照片的占位符(它需要几毫秒,这取决于关于OS的当前状态。)
要解决这个问题,列表视图应该有一些缓存机制,用于保存用户看到的最后X个元素并已经滚动,当用户滚动回这些元素时,列表视图应该发送convertView它保存的缓存视图。
我设法为一个元素人为地做,只是为了测试这个概念,它运行良好。但是我有理由假设列表视图中某些元素的缓存机制可能已经在ListView本身中实现,或者已经实现了类似的东西。
您可以将其视为以下内容。现在ListView保存了屏幕上看到的元素数量以及最后看到的元素数量,当需要绘制下一个元素时,列表视图将最后看到的元素作为转换视图发送。解决方案意味着列表视图将保存已查看的元素+缓存的X元素以及滚动的最后一个元素,而不再是缓存中的元素。当应该绘制一个新元素时,列表视图将为它提供不应该被缓存的元素,除非用户回滚到缓存中存在的元素,然后缓存中的元素将被发送为转换视图
- 编辑2 -
public View getView(int position, View convertView, ViewGroup parent)
{
//Get the item
final ItemForListActivity item = itemsListHashtable.get(position);
ViewGroup rowLayout;
//In case that the view is new create it
if (item.getItemType() == Interface.LIST_ITEM_TYPE_CONTACT)
{
ListItemViewHolder viewHolder;
if (convertView == null)
{
rowLayout = (ViewGroup) LayoutInflater.from(context).inflate(R.layout.list_view_item, parent, false);
viewHolder = new ListItemViewHolder();
viewHolder.image1 = (ImageView) rowLayout.findViewById(R.id.image1);
viewHolder.image2 = (ImageView) rowLayout.findViewById(R.id.image2);
//We save the item id that is associate with the holder, for now nothing is associate with it.
viewHolder.itemId = -1;
rowLayout.setTag(viewHolder);
}
//Otherwise just use the converted view
else
{
rowLayout = (ViewGroup) convertView;
viewHolder = (ListItemViewHolder) rowLayout.getTag();
}
//Only in case that the item id is not the one that is already drawn, we need to draw the item
if (viewHolder.itemId != item.getItemId())
{
viewHolder.itemId = item.getItemId();
//Draw image1
drawImage1(viewHolder, item);
//Draw image2
drawImage2(viewHolder, item);
}
}
return rowLayout;
}