ListView的Adapter调用notifyDataSetChanged()方法不生效

今天在写大作业的时候用到了ListView的数据更新操作。

后台获取到最新的数据,进行动态更新。

最初加载的时候显示本地数据库的数据,获取完通过以下代码显示。

if(bindUserList.size()>0){
    bindUserAdapter = new BindUserAdapter(getMContext(),bindUserList);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView parent, View view, int position, long id) {
    Intent intent = new Intent(getMContext(), BindChildInfoActivity.class);
        Bundle bundle = new Bundle();
        bundle.putInt("userItemId",position);
        bundle.putInt("deviceId",bindUserList.get(position).getUserId());
        intent.putExtra("Message",bundle);
        startActivity(intent);
        }
    });
    listView.setAdapter(bindUserAdapter);
}

然后下拉刷新获取后台最新的数据,动态更新ListView的Item项。

这是我最开始 的代码

bindUserList.clear();
bindUserList = serverRefreshJson.getUsers();
bindUserAdapter.notifyDataSetChanged();

但是试了很多次都不成功,百度也找不到解决方案。

然后在我走投无路的时候,突然想起来以前写过的一个项目,就翻出来,看了一下代码。

list.clear();
        
for(int i=0;i < devices.size();i++){
    Device device = devices.get(i);
    DeviceListAdapterBean bean = new DeviceListAdapterBean(device.getLockImg(),device.getName(),device.getCustomName());
    list.add(bean);
}

然后想起来我的数据源更新后是直接把值赋给了bindUserList,或许我应该试试addAll的方法。

bindUserList.clear();
List list = serverRefreshJson.getUsers();
LitePal.saveAll(list);
bindUserList.addAll(list);
bindUserAdapter.notifyDataSetChanged();

这样改过代码,又跑了一边,结果成功!

仔细想想,应该是bindUserList的直接赋值是赋的另一个对象,与之前的bindUserList对象不一样。addAll方法是对原来的bindUserList对象进行的操作,这样之后,原来的bindUserList对象还不变。notifyDataSetChanged()方法应该是根据原来的bindUserList对象来判断数据是否改变的。

希望大神们能给解释一下原因

你可能感兴趣的:(Android)