我的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)
来解决问题(并且,我认为,也可以消除行回收)。
但是我不会以这种方式遇到内存问题吗?为什么普通香草版不起作用?
感谢您的帮助。 问候, 小号
答案 0 :(得分:1)
你知道你只是分配
holder.story = story
convertView == null
时?考虑将holder.story = story
移到convertView
if-case之后,它应该可以更好地工作。顺便问一下,你甚至需要将“故事”存储在你的观众中吗?通常,该模式应仅用于存储视图和查看状态信息,而不是实际位置的数据。