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);
来跳转到指定的位置
如果通过
listView.setAdapter(adapter);
重设置了ListView的依赖adapter,想要页面停留来原来的地方就要使用listView.setSelection(int position);
来定位如果仅仅是通过
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);
注意事项一样。