android listview在回收之前保留上次查看的列表项视图

时间:2014-05-25 08:22:23

标签: android listview user-interface

我正在使用列表视图,并且我正在使用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;
    }

0 个答案:

没有答案