我使用ArrayAdapter在ListView中设置无尽滚动功能的数据。在ListView的行中有一个ImageView和两个textview。首先,我用10个项目加载ListView,然后向下滚动,我调用setonscrolllistener中的web服务来加载下一个10个项目到ListView。当新的项目被添加到数组列表时,我只需调用adapter.notifysetdatachanged
来告诉适配器刷新ListView。
现在的问题是,每当新的项目被添加到ListView,整个ListView刷新,这导致ListView中的图像,已经加载,闪烁。是的,我在磁盘和内存中缓存所有图像,并且代码非常顺利地缓存。
我还尝试使用此adapter.addall(myarraylist)
将数据添加到适配器,但它没有帮助。ImageViews仍在闪烁。我在StackOverflow上搜索了很多关于它的信息,发现你不能在ListView中添加和显示更多的项目,而不刷新整个ListView。我已经知道,但必须有一些方法来添加新的数据到ListView,而不是刷新已经加载的数据。
我像这样设置适配器。
public View getView(int position, View view, ViewGroup parent)
{
int main = R.layout.layout;
ViewHolder holder = null;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (view == null) {
holder = new ViewHolder();
view = inflater.inflate(main, null);
holder.image = (ImageView) convertView.findViewById(R.id.imageview);
///More stuff
view.setTag(holder);
} else {
holder = (ViewHolder)view.getTag();
}
// Loading ImageViews by Urls
return view;
}
有谁能解释一下吗?
似乎你正在做正确的方式,所以问题可能来自你的imageLoader。如果url是相同的,它不应该在你的imageview上再次设置图像。
。你可以使用setTag (url)
方法在你的imageView和测试,如果url已经改变。
解决方案是当图像没有改变时不重新加载。
在你的适配器getView()做:
// schedule rendering:
final String path = ... (set path here);
if (holder.lastImageUrl == null || !holder.lastImageUrl.equals(path)
|| holder.headerImageView.getDrawable() == null) {
// refresh image
imageLoader.displayImage(imageUri, imageAware);
} else {
// do nothing, image did not change and does not need to be updated
}
在成功(添加一个ImageLoadingListener)时设置holder。lasttimageurl = path,如果失败并取消设置holder。