【问题标题】:java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification.java.lang.IllegalStateException:适配器的内容已更改,但 ListView 没有收到通知。
【发布时间】:2017-01-12 10:40:55
【问题描述】:

我想把大量的add delete计算工作放在worker线程上,notifyDataSetChanged工作放在ui线程上。在它的基础上避免java.lang.IllegalStateException。例外情况如下: java.lang.IllegalStateException:适配器的内容已更改,但 ListView 没有收到通知。确保适配器的内容不是从后台线程修改的,而只是从 UI 线程修改的。确保您的适配器在其内容更改时调用 notifyDataSetChanged()。

代码简写如:

new Thread(){
            @Override
            public void run() {
                for(int i=0; i<5000; i++){
                    mDatas.add(i);
                }
                mActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mAdapter.notifyDataSetChanged();
                    }
                });
            }
        }.start();

我在网上搜索了很长时间。但是没有用。请帮助或尝试提供一些想法如何实现这一目标。

【问题讨论】:

  • 什么是 mAcitvity ?
  • 您也可以尝试在 UI 线程 中添加数据和 notifyDataSetChanged
  • @jaydroider 谢谢,我读了这个问题,但没有找到完美的答案。
  • @quick learner 这是当前活动

标签: android


【解决方案1】:

有两种解决方案可以克服它。

1) 使用AsyncTask 并在onPostExecute() 方法中更新您的适配器。

@override
protected void onPostExecute(String result) {
  mAdapter.notifyDataSetChanged();
}   

2) 使用HandlerThread 注册消息并在handleMessage() 中更新您的适配器。

    new Thread(){
        @Override
        public void run() {

                  handler.sendEmptyMessage(0);
                }
            });
        }
    }.start();

 Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message message) {
            mAdapter.notifyDataSetChanged();
            return false;
        }
    });

【讨论】:

  • 你可能没有读过我的问题,无论如何还是谢谢你
【解决方案2】:

您在非 UI 线程中向 ArrayList 添加项目并在 UI 线程上调用 notifyDataSetChanged

new Thread(){
            @Override
            public void run() {

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        for(int i=0; i<5000; i++){
                            mDatas.add(i);
                        }
                        mAdapter.notifyDataSetChanged();
                    }
                });
            }
        }.start();

【讨论】:

  • UI线程中大量操作会出现UI卡顿等性能问题。
  • 您是从任何后台服务呼叫mAdapter.notifyDataSetChanged() 吗?如果它来自活动/片段,则您不需要整个 runOnUiThread 东西
  • 它来自调用 mAdapter.notifyDataSetChanged() 的对话框。
【解决方案3】:

试试这个

调用runOnUi线程前检查mActivity是否为null

 new Thread(){
                @Override
                public void run() {
                    for(int i=0; i<5000; i++){
                        mDatas.add(i);
                    }
                  if(mActivity!=null){
                    mActivity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mAdapter.notifyDataSetChanged();
                        }
                    });
                   }
                }
        }.start();

【讨论】:

  • 感谢您指出我的代码存在的问题。而我专注于上述问题。
  • 对不起,我希望我能为你投票,但我的荣誉还不到十五岁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
相关资源
最近更新 更多