点击ListView闪退

============问题描述============


一点击ListVIew就闪退,调试了两天了,好痛苦,望大家解救。

这是部分日志

02-06 10:58:39.207: E/InputEventReceiver(764): Exception dispatching input event.
02-06 10:58:39.207: E/MessageQueue-JNI(764): Exception in MessageQueue callback:handleReceiveCallback
02-06 10:58:39.377: E/MessageQueue-JNI(764): 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. [in ListView(16908298, class android.widget.ListView) with Adapter(class android.widget.SimpleAdapter)]
02-06 10:58:39.377: E/MessageQueue-JNI(764): at android.widget.ListView.layoutChildren(ListView.java:1538)


部分代码:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_clear);
    bar = (ProgressBar) findViewById(R.id.progressBar0);
    list = new ArrayList>();
    SimpleAdapter adapter = new SimpleAdapter(this, list,
    R.layout.list_view, new String[] { "name", "size", "path"},
    new int[] { R.id.name, R.id.size, R.id.path });
    setListAdapter(adapter);
    System.out.println("hh");

    handler = new MyHandler();

    thread = new MyThread();
    thread.start();

    }

private void SendMessage(String name, String path, String size) {
Message message = handler.obtainMessage();
HashMap hashMap = new HashMap();
hashMap.put("name", name);
hashMap.put("path", path);
hashMap.put("size", size);
message.obj = hashMap;
handler.sendMessage(message);

}

class MyHandler extends Handler {

    @Override
    public void handleMessage(Message msg) {
        HashMap<String, String> hashMap = (HashMap<String, String>) msg.obj;
        list.add(hashMap);
}

没有在子线程改UI,只是用Handler往ArrayList添加东西,Adapter是在主线程生成和设置的。



添加下面这些代码,点击ListView时打印不出“Click”,直接退出了。

protected void onListItemClick(ListView l, View v, int position, long id) {
System.out.println("Click");
}

============解决方案1============


报错的意思是说你的加载的SimpleAdapter有问题,不然你自己写一个adatper不要去继承已经提供的SimpleAdapter,,,

============解决方案2============


添加数据后adapter.notifyDataSetChanged();

============解决方案3============


The content of the adapter has changed but ListView did not receive a notification


你的adapter没有刷新
class MyHandler extends Handler {

     @Override
     public void handleMessage(Message msg) {
         HashMap<String, String> hashMap = (HashMap<String, String>) msg.obj;
         list.add(hashMap);
这里加上adapter.notifyDataSetChanged(); 
 }

============解决方案4============


还有你的代码的质量不太好,
thread = new MyThread();
     thread.start();这个有什么用。
 public void handleMessage(Message msg) {
这里面最好用switch(msg.what)判断一下
}
调用handler.sendE...


============解决方案5============


引用 5 楼 u013241311 的回复:
Quote: 引用 3 楼 pengguohua1988 的回复:

The content of the adapter has changed but ListView did not receive a notification


你的adapter没有刷新
class MyHandler extends Handler {

     @Override
     public void handleMessage(Message msg) {
         HashMap<String, String> hashMap = (HashMap<String, String>) msg.obj;
         list.add(hashMap);
这里加上adapter.notifyDataSetChanged(); 
 }




我查资料时别人也是这样说,但加上这句后报空指针异常(就单单加这一句,其它什么都没改),求指教。


QQ1519203524
posted @ 2014-10-17 10:34  android开发教程2015  阅读(1342)  评论(0编辑  收藏  举报
我要啦免费统计