用android的notifyDataSetChanged()方法会进行getView,导致每次所有都刷新;效率太低,我要怎样使某个item数据改变时只刷新那个item?
我的代码如下,请大神帮我改下!谢谢
public class OfflineDownloadedAdapter extends BaseAdapter {
private List<OfflineMapCity> cities = new ArrayList<OfflineMapCity>();
private Context mContext;
private OfflineChild currentOfflineChild;
public OfflineDownloadedAdapter(Context context) {
this.mContext = context;
initCityList();
}
/**
* 重新初始化数据加载数据
*/
public void notifyDataChange() {
initCityList();
}
private void initCityList() {
if (cities != null) {
for (Iterator it = cities.iterator(); it.hasNext();) {
OfflineMapCity i = (OfflineMapCity) it.next();
it.remove();
}
}
cities.addAll(ByteOfflineMapManager.getInstance(mContext).getDownloadOfficeMapCityList());
cities.addAll(ByteOfflineMapManager.getInstance(mContext).getDownloadingCityList());
notifyDataSetChanged();
}
@Override
public int getCount() {
return cities.size();
}
@Override
public Object getItem(int index) {
return cities.get(index);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return 0;
}
public final class ViewHolder {
public OfflineChild mOfflineChild;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView != null) {
viewHolder = (ViewHolder) convertView.getTag();
} else {
viewHolder = new ViewHolder();
currentOfflineChild = new OfflineChild(mContext);
convertView = currentOfflineChild.getOffLineChildView();
viewHolder.mOfflineChild = currentOfflineChild;
convertView.setTag(viewHolder);
}
OfflineMapCity offlineMapCity = (OfflineMapCity) getItem(position);
viewHolder.mOfflineChild.setOffLineCity(offlineMapCity);
return convertView;
}
}
首先不要每次都初始化数据,你只需要修改cities中对应的数据,然后调用adapter的notify即可
楼主,你可以看看这个:
http://wuxiaolong.me/2015/07/08/listView_item_state/
notifyDataChange 这个方法去掉,你在调用item点击事件的时候, 直接修改外部传入的List里面对应的那个item数据对象,然后直接调用Adapter的notifyDataChanged()方法就可以了。这种情况下没必要去写单个Item的点击事件。
单个Item数据刷新是在什么情况下刷新的?
http://wuxiaolong.me/2015/07/08/listView_item_state/
adapter的notifydatachanged(),在数据改变时就会刷新ui。你每次都把所有的数据重新来了一遍,然后再刷新。
不要用notifydatachanged()方法,给你个例句:
//position是你要更新的item的位置,从0开始
Mapmap=listItems.get(position);
map.put("IsFocused", “关注”);//将新的文件名添加到Map以替换旧文件名
listItems.set(position, map);//替换listItems中原来的map
谢谢大家,我已经解决了
首先第一点:你的initCityList方法里面如果要清空list,直接list.clear()就好了,干嘛来遍历删除呢?
第二点,ListView用的是观察者模式,调用notifyDataSetChanged()方法,是不会调用getView方法的,不会有性能上的消耗。如果真有性能消耗,Google是不可能把这么不靠谱的方法给我们用的。
你要知道getView是直接实例化View,这个内存开销是很大的。