ListView遇到的坑

来源:互联网 发布:姜维 知乎 编辑:程序博客网 时间:2024/05/18 07:43

1. adapter.notifyDataSetChanged();

adapter中的数据有变化时必须第一时间使用adapter.notifyDataSetChanged();更新UI展示的数据。

2. adapter.notifyDataSetInvalidated();

ListView依赖的adapter的定义形式一般是:

listView.setAdapter(adapter);

实际项目中往往会出现改变ListView的依赖adapter而执行listView.setAdapter(adapter);,此时必须提前执行adapter.notifyDataSetInvalidated();将原数据源设置为无效,否则有些型号的手机会出现Bug,下面是在360N4出现的bug

这里写图片描述

分析:
日志说,我们用了Header导致数组越界,但事实上我没有使用Header。
打个比方,adapter存储数据的容器我们叫瓶子,adapter中的数据我们比作水,这是由于adapter中装的水没有变,此时又重新定义adapter导致的盛水的瓶子变了,很可能新瓶子无法盛下所有的水从而导致溢出。

此分析纯属假想,没有证据证明,如果谁有更好的解释请在评论区探讨

3. 什么时候需要使用listView.setSelection(int position);来跳转到指定的位置

  1. 如果通过listView.setAdapter(adapter);重设置了ListView的依赖adapter,想要页面停留来原来的地方就要使用listView.setSelection(int position);来定位

  2. 如果仅仅是通过 adapter.append(data);或者adapter.delete(app.getId());(自定义的添加和删除adapter中数据的方法),改变了adapter中的数据,只要及时通过adapter.notifyDataSetChanged();更新UI即可,还会停留在原位置

4. listView.setSelection(int position);跳转失效

这个方法只有在ListView完成数据加载之后调用才会生效

否则,网络上的解决方法:
1. 让listview重新获得焦点listView.requestFocusFromTouch();
2. listview.post(new Runnable() { })在runnable中执行setSelection方法
3. adapter.notifyDataSetChanged();刷新之后执行setSelection方法

另外还有带有动画效果的跳转,listView.smoothScrollToPosition(int position);注意事项一样。

原创粉丝点击