java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive

来源:互联网 发布:微商团队怎么优化 编辑:程序博客网 时间:2024/04/27 13:58

我们知道在子线程中更新UI,会报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,这个错误相信大家都遇见过,在此记录下,写一个简单的Demo,

package com.example.listviewdemo;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity {private ListView lv;private List<String> datas;private MyAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);adapter = new MyAdapter();lv = (ListView) findViewById(R.id.lv);lv.setAdapter(adapter);datas = new ArrayList<String>();new Thread(){public void run() {for(int i=0;i<10000;i++){datas.add("测试:"+i);adapter.setDatas(datas);adapter.notifyDataSetChanged();}}}.start();}class MyAdapter extends BaseAdapter{private List<String> datas;public void setDatas(List<String> datas) {this.datas = datas;}@Overridepublic int getCount() {return (datas!=null&&datas.size()>0)?datas.size():0;}@Overridepublic Object getItem(int arg0) {return datas.get(arg0);}@Overridepublic long getItemId(int arg0) {return arg0;}@Overridepublic View getView(int arg0, View arg1, ViewGroup arg2) {TextView tv = new TextView(MainActivity.this);tv.setText(datas.get(arg0));return tv;}}
可以看到adapter.notifyDataSetChanged();这行代码是在子线程中,所以导致上述错误,解决起来就很简单,在这不多说

0 0
原创粉丝点击