position需要考虑包含header、footer的情况吗?
需要考虑header的个数,因为加入header后对真正的position有影响,所以局部更新的代码块中这部分应该这么写 /获取指定位置view对象/ View view = listView.getChildAt(position - firstVisiblePosition+header的个数);
试了下好像不行,改变了datas里面某个position对应的数据,没有通知到adapter,所以没有刷新。你是怎样不调用adapter.notifyDataSetChanged,通知adapter更新的?@Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = LayoutInflater.from(context).inflate(layoutId, null); } Log.d("listview", "---------getView()-----------"); T t = getItem(position); convertView(convertView, t); return convertView; }
getView方法里面获取poisiton对于的数据时,还是从之前的datas中获取,并非从改变后的datas里面获取。请指教
你是问我写的局部更新还是你用代码adapter.notifyDataSetChanged这个去全部刷新不能刷新呢?
/** * 局部更新数据 * @param parent * @param position 需要更新的item的位置 */ public void notifyItemDataSetChanged(AbsListView parent, int position, List<T> dataList){
data = dataList;
int firstVisiblePosition = parent.getFirstVisiblePosition();
int lastVisiblePosition = parent.getLastVisiblePosition();
// 更新可见范围内指定位置的item,不可见的滑动后自动会调用getView方法更新
if (position >= firstVisiblePosition && position <= lastVisiblePosition){
View childView = parent.getChildAt(position - firstVisiblePosition);
Log.d(TAG, "----notifyItemDataSetChanged--getView-----");
getView(position, childView, parent);
}
}
将改变后的数据集合传入,可以实现更新,但是还是调用了多次getView方法
当然是局部更新
@Override public View getView(int position, View convertView, ViewGroup parent) { Log.d(TAG, "-----getView-----");
if (getItemViewType(position) == 0)
{
return createIndeterminateProgressView(convertView, parent);
}
final H helper = getAdapterHelper(position, convertView, parent);
T item = getItem(position);
helper.setAssociatedObject(item);
convert(helper, item);
return helper.getView();
}
11-04 11:26:15.433 30344-30344/com.jm.scrollerdemo D/BaseQuickAdapter: ----notifyItemDataSetChanged--getView----- 11-04 11:26:15.433 30344-30344/com.jm.scrollerdemo D/BaseQuickAdapter: -----getView----- 11-04 11:26:15.433 30344-30344/com.jm.scrollerdemo D/BaseQuickAdapter: -----getView----- 11-04 11:26:15.433 30344-30344/com.jm.scrollerdemo D/BaseQuickAdapter: -----getView----- 11-04 11:26:15.433 30344-30344/com.jm.scrollerdemo D/BaseQuickAdapter: -----getView----- 11-04 11:26:15.433 30344-30344/com.jm.scrollerdemo D/BaseQuickAdapter: -----getView----- 11-04 11:26:15.443 30344-30344/com.jm.scrollerdemo D/BaseQuickAdapter: -----getView----- 11-04 11:26:15.443 30344-30344/com.jm.scrollerdemo D/BaseQuickAdapter: -----getView----- 11-04 11:26:15.443 30344-30344/com.jm.scrollerdemo D/BaseQuickAdapter: -----getView-----
并不能实现更新某个item,只调用一次getView方法,请指教。
首先在判断要更新哪块这块去调用getView()方法的代码只走了一次,说明这里 没有问题,

至于多次调用getview,肯定是其他原因引起的,方便的话,请将完整代码给我,我看一下,我的邮箱:[email protected]
已发送至你的邮箱,麻烦有空看一下,谢谢
好的,刚看到,我吃完饭帮你看看
我看了你的万能适配器有问题,建议换个适配器,可以参考这个http://blog.csdn.net/linglongxin24/article/details/52813227 , 你随便用最基本的自己写的都是没有问题的,这个适配器内部封装有问题。


感谢你的回复,我用普通adapter、你推荐的adapter试了局部刷新,结果都一样:在更新某一个item数据时,getView方法调用了很多次。这样的话,和直接调用notifyDataSetChanged没大多差别。
不可能的,你运行下我的demo试试?
或者你写个普通的适配器把代码给我,我看看
???
发现给item写死一个固定的高度后,在更新单个item时,getView方法就不会调用多次了。
我试了你写的demo, 如果你的item高度不固定,在更新单个item时,getView方法就调用了很多次。而一般我们不会写死item的高度。
不好意思,今天下午有点忙,才看到你的消息,这样的话建议你先用第一种方法去局部更新,容我有时间了看看这个问题怎么解决。
你的问题已经解决,请看 Android ListView优化之getView频繁多次调用与ViewHolder是如何工作的?:http://blog.csdn.net/linglongxin24/article/details/53055869 。不是item高度的问题,是ListView高度的问题。