当convertView被回收时,ListView适配器会变得混乱

时间:2012-01-09 14:08:04

标签: android listview

我的ListView有一个直接的BaseAdapter。它下载JSON提要并在行中显示数据。 ViewHolder包含视图和名为“Story”的数据对象。一切正常。

但是,经过一些较长的列表滚动后,我注意到两件事。

1)我的日志显示适配器在向下滚动时正在重新加载Feed。这很奇怪,因为我将整个JSON数组放入变量中,为什么它必须重新加载?

2)更重要的是,在一些来回滚动之后,行包含错误的“Story”对象。以下是getView例程的相关部分:

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    Story story = stories.get(position);
    if (convertView == null) {
        //create holder
        holder = new ViewHolder();
        convertView = inflator.inflate(R.layout.story_list_item, parent, false);
        holder.titleView = (TextView) convertView.findViewById(R.id.story_list_title);
        holder.dateView = (TextView) convertView.findViewById(R.id.story_list_date);
        holder.story = story;
        holder.imageView = (ImageView) convertView.findViewById(R.id.story_list_image);
        convertView.setTag(holder);
        } else  {
            holder = (ViewHolder) convertView.getTag();
        }       
    // configure the view       
    holder.titleView.setText(story.title);
    return convertView;
}

足够简单。现在奇怪的是,我可以通过消除if语句if (convertView == null) 来解决问题(并且,我认为,也可以消除行回收)。

但是我不会以这种方式遇到内存问题吗?为什么普通香草版不起作用?

感谢您的帮助。 问候, 小号

1 个答案:

答案 0 :(得分:1)

你知道你只是分配

holder.story = story 

convertView == null时?考虑将holder.story = story移到convertView if-case之后,它应该可以更好地工作。顺便问一下,你甚至需要将“故事”存储在你的观众中吗?通常,该模式应仅用于存储视图和查看状态信息,而不是实际位置的数据。