ListViewUpdate icon indicating copy to clipboard operation
ListViewUpdate copied to clipboard

position需要考虑包含header、footer的情况吗?

Open jamin918 opened this issue 9 years ago • 21 comments

jamin918 avatar Nov 04 '16 02:11 jamin918

需要考虑header的个数,因为加入header后对真正的position有影响,所以局部更新的代码块中这部分应该这么写 /获取指定位置view对象/ View view = listView.getChildAt(position - firstVisiblePosition+header的个数);

linglongxin24 avatar Nov 04 '16 02:11 linglongxin24

试了下好像不行,改变了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里面获取。请指教

jamin918 avatar Nov 04 '16 03:11 jamin918

你是问我写的局部更新还是你用代码adapter.notifyDataSetChanged这个去全部刷新不能刷新呢?

linglongxin24 avatar Nov 04 '16 03:11 linglongxin24

/** * 局部更新数据 * @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方法

jamin918 avatar Nov 04 '16 03:11 jamin918

当然是局部更新

jamin918 avatar Nov 04 '16 03:11 jamin918

@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-----

jamin918 avatar Nov 04 '16 03:11 jamin918

并不能实现更新某个item,只调用一次getView方法,请指教。

jamin918 avatar Nov 04 '16 03:11 jamin918

首先在判断要更新哪块这块去调用getView()方法的代码只走了一次,说明这里 没有问题,

_20161104112932

至于多次调用getview,肯定是其他原因引起的,方便的话,请将完整代码给我,我看一下,我的邮箱:[email protected]

linglongxin24 avatar Nov 04 '16 03:11 linglongxin24

已发送至你的邮箱,麻烦有空看一下,谢谢

jamin918 avatar Nov 04 '16 03:11 jamin918

好的,刚看到,我吃完饭帮你看看

linglongxin24 avatar Nov 04 '16 04:11 linglongxin24

我看了你的万能适配器有问题,建议换个适配器,可以参考这个http://blog.csdn.net/linglongxin24/article/details/52813227 , 你随便用最基本的自己写的都是没有问题的,这个适配器内部封装有问题。

linglongxin24 avatar Nov 04 '16 05:11 linglongxin24

_20161104134505

linglongxin24 avatar Nov 04 '16 05:11 linglongxin24

_20161104135338

linglongxin24 avatar Nov 04 '16 05:11 linglongxin24

感谢你的回复,我用普通adapter、你推荐的adapter试了局部刷新,结果都一样:在更新某一个item数据时,getView方法调用了很多次。这样的话,和直接调用notifyDataSetChanged没大多差别。

jamin918 avatar Nov 04 '16 07:11 jamin918

不可能的,你运行下我的demo试试?

linglongxin24 avatar Nov 04 '16 07:11 linglongxin24

或者你写个普通的适配器把代码给我,我看看

linglongxin24 avatar Nov 04 '16 08:11 linglongxin24

???

linglongxin24 avatar Nov 04 '16 08:11 linglongxin24

发现给item写死一个固定的高度后,在更新单个item时,getView方法就不会调用多次了。

jamin918 avatar Nov 04 '16 09:11 jamin918

我试了你写的demo, 如果你的item高度不固定,在更新单个item时,getView方法就调用了很多次。而一般我们不会写死item的高度。

jamin918 avatar Nov 04 '16 09:11 jamin918

不好意思,今天下午有点忙,才看到你的消息,这样的话建议你先用第一种方法去局部更新,容我有时间了看看这个问题怎么解决。

linglongxin24 avatar Nov 04 '16 13:11 linglongxin24

_20161107104353 你的问题已经解决,请看 Android ListView优化之getView频繁多次调用与ViewHolder是如何工作的?:http://blog.csdn.net/linglongxin24/article/details/53055869 。不是item高度的问题,是ListView高度的问题。

linglongxin24 avatar Nov 07 '16 02:11 linglongxin24