Java Android ListView正在回收仍在屏幕上的项目
我使用的是ListView,其中有一个自定义对象膨胀到getView方法中 当listview触发onItemClicked事件时,我的问题就开始了,它会重新绘制项目 这不是问题所在。出现实际问题是因为我正在回收getView提供给我的项目 在我开始之前,这里是我正在使用的代码Java Android ListView正在回收仍在屏幕上的项目,java,android,listview,Java,Android,Listview,我使用的是ListView,其中有一个自定义对象膨胀到getView方法中 当listview触发onItemClicked事件时,我的问题就开始了,它会重新绘制项目 这不是问题所在。出现实际问题是因为我正在回收getView提供给我的项目 在我开始之前,这里是我正在使用的代码 public View getView(int position, com.abc.rxcard.Item itemAtPosition, View convertView, ViewGroup pare
public View getView(int position, com.abc.rxcard.Item itemAtPosition,
View convertView, ViewGroup parent) {
LinearLayout thisItem;
//Get the current alert object
//Inflate the view
if(convertView==null)
{
thisItem = new LinearLayout(this);
String inflater = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater vi;
vi = (LayoutInflater)this.getSystemService(inflater);
vi.inflate(R.layout.offerrow, thisItem, true);
}
else
{
thisItem = (LinearLayout) convertView;
}
Log.d("thisItem","This Item is Index " + position + " " + thisItem.toString() + " " + Integer.toHexString(System.identityHashCode(thisItem)));
//Get the text boxes from the listitem.xml file
TextView caption =(TextView)thisItem.findViewById(R.id.caption);
TextView subText =(TextView)thisItem.findViewById(R.id.subText);
ImageView icon = (ImageView)thisItem.findViewById(R.id.offerIcon);
//Assign the appropriate data from our alert object above
caption.setText(itemAtPosition.text());
subText.setText(itemAtPosition.subText());
MyUtils.setImageFromURLInBackgroundThread(icon, itemAtPosition.icon());
return thisItem;
}
当我点击这些项目时,问题就出现了。
日志输出如下所示
04-20 14:36:28.402: DEBUG/thisItem(12495): This Item is Index 0 android.widget.LinearLayout@44db1c50 44db1c50
04-20 14:36:28.432: DEBUG/thisItem(12495): This Item is Index 1 android.widget.LinearLayout@44da9038 44da9038
04-20 14:36:28.442: DEBUG/thisItem(12495): This Item is Index 2 android.widget.LinearLayout@44d2ee48 44d2ee48
04-20 14:36:28.932: DEBUG/thisItem(12495): This Item is Index 0 android.widget.LinearLayout@44d2ee48 44d2ee48
04-20 14:36:28.952: DEBUG/thisItem(12495): This Item is Index 1 android.widget.LinearLayout@44da9038 44da9038
04-20 14:36:28.962: DEBUG/thisItem(12495): This Item is Index 2 android.widget.LinearLayout@44db1c50 44db1c50
04-20 14:36:29.622: DEBUG/thisItem(12495): This Item is Index 0 android.widget.LinearLayout@44db1c50 44db1c50
04-20 14:36:29.652: DEBUG/thisItem(12495): This Item is Index 1 android.widget.LinearLayout@44da9038 44da9038
04-20 14:36:29.662: DEBUG/thisItem(12495): This Item is Index 2 android.widget.LinearLayout@44d2ee48 44d2ee48
如您所见,索引0和2正在来回翻转项目。如果这些项目不在屏幕上,这就不是问题了。但是,当我单击项目时(并且因为图像加载在背景线程中),我在项目1和3上的图像每次单击都会前后翻转
这似乎是一种不好的行为。我不知道该怎么办才能解决这个问题。是否可以在ListView中添加设置或其他内容来阻止它这样做?结果表明,回收商正在检查我的所有项目并将它们放入废品堆,因为它将在这个运行周期中刷新它们。我遇到的问题是,它以相反的顺序遍历项目,我应该想当然地认为我需要删除对象,然后再次设置其值 我解决这个问题的方法是将下载到磁盘上的图像缓存到指定位置至少一分钟。当刷新发生时,它将尝试从缓存加载图像,而不是每次下载。并且仅在映像过期时下载。从而立即用所需的图像替换图像,而不是保留现有的废弃图像
我面临的问题已经解决了,但事实仍然是,他们回收了屏幕上的项目。。。。很难相信,单击一个项目时,整个ListView都会刷新,所有项目都会重新创建。但是,当你把饼干浸在java中时,它就是这样破碎的……我以前也遇到过同样的问题 我认为问题在于你的背景图片线程下载程序。如果您快速滚动列表视图,并且由于同一行视图被反复使用,您可能会尝试将所有这些图像下载到同一个“图标”图像视图,并将图像一个接一个地设置,从而产生图像来回切换的效果 我的解决方案是在调用图像下载程序之前,在图标图像视图上设置带有唯一标识符的标记。比如说:
icon.setTag(imageUrl);
MyUtils.setImageFromURLInBackgroundThread(icon, itemAtPosition.icon(), imageUrl);
在setImageFromURLInBackgroundThread()方法中,在线程上完成图像下载后,在设置为图标图像视图之前,检查图标视图以查看下载url是否与图像url匹配。例如:
if (icon.getTag() != null) {
viewTagUrl = String.valueOf(icon.getTag());
}
if(imageUrl.equalsIgnoreCase(viewTagUrl)) {
icon.setImageBitmap(bitmap);
}
另外,因为图像下载有时需要一段时间,所以我也会在运行线程下载图像之前清理图像视图并设置默认图像
icon.setImageBitmap(null);
icon.setImageResource(defaultImage);
...
downloadThread.start();