我正在使用ArrayAdapter在ListView中设置具有无限滚动功能的数据。 ListView的行中有一个ImageView和两个TextView。首先,我正在加载带有10个项目的ListView,然后向下滚动,我调用setonscrolllistener中的Web服务将下一个10项加载到ListView。当新项目添加到Arraylist时,我只需调用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;
}
有人可以对此有所了解吗?
答案 0 :(得分:2)
您似乎正在以正确的方式执行此操作,因此问题可能来自您的imageLoader。如果网址相同,则不应在imageview上再次设置图像。
e.g。您可以在imageView上使用setTag (url)
方法,并测试网址是否已更改。
希望这会对你有所帮助。
答案 1 :(得分:1)
解决方案是在图像未更改时不重新加载。
在适配器中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.lastImageUrl = path,失败并取消你将holder.lastImageUrl设置为null,以便下次重新加载。