android之(ListView,RecycleView等)调用notifyDataSetChanged()界面不更新问题

之前做项目偶尔会出现这个问题,就是适配器Adapter绑定的数据源改变了,调用notifyDataSetChanged()方法,界面却没反应。然后我发现了问题所在,就是Adapter绑定的数据源的问题。

我以前的错误做法(界面不更新):

下面的栗子是刷新RecyclerView界面,我猜测由于初始化适配器myListAdapter绑定了myListData的内存地址,但更新数据时,myListData的内存地址改变了,所以myListAdapter找不到新的数据了,所以更新界面失败

//1.创建变量myListData
private List<ListItem> myListData;

//2.初始化(以RecyclerView为例)
RecyclerView recyclerView = getActivity().findViewById(R.id.recycler);
GridLayoutManager layoutManager = new GridLayoutManager(this,1);
recyclerView.setLayoutManager(layoutManager);
MyListAdapter myListAdapter = new MyListAdapter(myListData);//绑定myListData内存地址
recyclerView.setAdapter(myListAdapter);
recyclerView.setNestedScrollingEnabled(false);

//3.更新数据-给myListData分配新的内存地址
myListData = new ArrayList<>();
myListItem.add(new ListItem("数据"));

//4.调用notifyDataSetChanged()方法--更新界面失败
myListAdapter.notifyDataSetChanged();

正确做法(界面更新):

//1.先给这个list一个内存地址
private List<ListItem> myListData = new ArrayList<>();

//2.初始化(以RecyclerView为例)
RecyclerView recyclerView = getActivity().findViewById(R.id.recycler);
GridLayoutManager layoutManager = new GridLayoutManager(this,1);
recyclerView.setLayoutManager(layoutManager);
MyListAdapter myListAdapter = new MyListAdapter(myListData);//绑定myListData内存地址
recyclerView.setAdapter(myListAdapter);
recyclerView.setNestedScrollingEnabled(false);

//3.更新数据-内存地址不能改变
myListItem.set(1, new ListItem("data0"));//更改固定位置数据
myListItem.clear();//更改所有数据就先清数据再添加数据
myListItem.add(new ListItem("data"));

//4.最后调用notifyDataSetChanged()方法-更新界面成功
myListAdapter.notifyDataSetChanged();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值