Android BaseAdapter 更新数据 notifyDataSetInvalidated() notifyDataSetChanged()

         请原谅这个问题现在才提出来,在一个fragment界面上需要在列表项展示好几行数据,需要根据网络通知,获取数据,重新更新listview里面的数据,那首先想到的是使用适配器BaseAdapter,相信很多朋友都可以从网上找到baseAdapter的详细讲解,我就不说了,说一下我用这个适配器遇到的问题:

      问题1:  当网络数据发生变化,发送更新消息过来,这时候就需要更新数据,重新绑定数据源,我在数据变化时候,后面加上tableAdapter.notifyDataSetInvalidated();,的确是可以更新,但是遇到一个很大的问题就是当显示的列表很多,需要下拉到底,停在底部的时候,这时候数据发生变化,重新绘制listview,就会导致,列表跳到第一项,导致用户体验及其的不好,整个界面不停的跳动,这是无法容忍的,解决的办法:

      public void fireTableDataChange() {
handler.post(new Runnable() {
@Override
public void run() {
// tableAdapter.notifyDataSetInvalidated();
tableAdapter.notifyDataSetChanged();//换成这个方法之后,就不会出现数据更新界面太跳
}
});
}

     分析原因如下:

    

 1:如果要刷新的数据源改变了就调用notifyDataSetChanged ()例如:我们在新浪微博中,要进行分显示刷新微博;

      2:如果那个数据源失效了之后就 调用notifyDataSetInvalidated()


另一位的见解:

notifyDataSetInvalidated(),会重绘控件(还原到初始状态)
notifyDataSetChanged(),重绘当前可见区域



Android BaseAdapter 更新数据 notifyDataSetInvalidated() notifyDataSetChanged()

你可能感兴趣的:(Android)