关于ListView数据刷新的一些细节

本文探讨了在使用ListView显示加载数据时遇到的适配器内容改变但ListView未收到通知的问题,通过在主线程中使用Handler对象进行数据刷新,成功解决了此异常,并解释了在非UI线程中调用adapter.notifyDataSetChanged()导致的'Onlytheoriginalthreadthatcreatedaviewhierarchycantouchitsviews.'错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在用ListView显示加载数据,在数据发生变化时就会出现这样的错误:

java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.

意思是说:适配器的内容已经改变,但ListView中没有收到通知。

这个时候我没很容易就想到要给ListView发一个通知,于是查找资料后发现在数据发生改变后调用

adapter.notifyDataSetChanged();

问题似乎就解决了,但运行后又发现出现了新的错误:

Only the original thread that created a view hierarchy can touch its views.

意思是说:只有原始线程可以改变视图。

原因是因为我们在改变数据内容是在子线程中完成的,adapter.notifyDataSetChanged();也是在子线程中调用的,它是非UI安全的,也就是说,不接受非UI线程的修改请求。当我们通过别的线程(非主线程或者说是非原始线程)来修改它的时候,就会出现错误。解决方法就是在主线程中new一个Handler对象

private MyHandler myHandler = new MyHandler();

这个MyHandler类是继承了Handler

class MyHandler extends Handler{  
		  
        @Override  
        public void handleMessage(Message msg) {  
        	//刷新listview  
    		adapter.notifyDataSetChanged();  
            super.handleMessage(msg);  
        }  
          
    }  

只要在handleMessage中调用adapter.notifyDataSetChanged();通知ListView发生改变就可以更新视图了。

在数据发生变化的地方调用

 Message msg=new Message();  
myHandler.handleMessage(msg)

;  




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值