使用adapter的notifyDataSetChanged时列表数据没有刷新

时间:2022-09-04 19:36:02

纪录一下之前犯得一个错误,在使用viewPager时,在setUserVisible()方法中加载数据,成功之后发现使用adapter的notifyDataSetChanged时,列表还是没有数据,在滑动viewPager俩页之后时才发现列表中有了数据。

notifyDataSetChanged方法是通过反射查看view中使用的数据是否发生了改变,发生了改变,则进行重绘图形

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

convertView = inflater.inflate(R.layout.zhihu_aty_main,container,false);
listView = (ListView) convertView.findViewById(R.id.listView);
adapter = new MessageAdapter(list, context);
listView.setAdapter(adapter);

首先在onCreateView方法中给listview设置了一个空的list.

list = NetUtils.parseJsonData();
adapter.notifyDataSetChanged();

然后我们从网络获取数据赋值给list,然后调用adapter的更新数据的方法,但是这样的结果是列表并没有任何的数据的增加。

问题的原因出在我们是让list引用到了另外一块内存数据块,但他之前引用的那个数据块并没有发生任何的变化,而notifyDataSetChanged恰恰就是检查的那个数据,所以造成了数据没有更新的结果,而滑动viewPager之后,他会重新调用onCreateView方法,给adapter重新设置了更新数据之后的list,故这时列表才有了数据,

那么该如何来刷新数据呢?

public void addItems(List<MessageWenWen> list){
this.list.addAll(list);
notifyDataSetChanged();
}

可以提供上述的方法,把更新的数据加到之前的list里面,就不会发生原来的情况了.

若是想要更换全新的数据则可以

public void updateItemsData(List<MessageWenWen> list){
this.list = list;
notifyDataSetChanged();
}

这里可能有人就会说怎么我在Fragment中这样使用就是错的,而在adapter中使用就不会发生错误,主要是因为在更新adapter时他只会看adapter中list中的数据变化了,当你改变了Fragemnt中list的值,可adapter中的list的数据并没有发生变化