【问题标题】:IllegalStateException: The content of the adapter has changed but ListView did not receive a notification?IllegalStateException:适配器的内容发生了变化但ListView没有收到通知?
【发布时间】:2015-10-19 10:43:24
【问题描述】:

我正在工作的应用程序中,我必须显示可用 wifi 的自定义列表。为此,我在重写方法中获取列表:

public void onScanComplete(List<ScanResult> results) {}

从这里,我调用 setAdapter。一旦列表显示它滚动正常而没有任何崩溃但是当我单击任何列表项以连接该wifi时提供密码 返回列表调用以下方法:-

 private int counter;
@Override
public void onConnectivityChange(final NetworkInfo info) {
         int len = mItems.size();

        for (int index = 0; index < len; index++) {
            WifiListData item = mItems.get(index);
            item.setIsConnected(false); // setting each to not connected
            item.setState(null);
            if (item.getSSID()!=null&&item.getSSID().equals(info.getExtraInfo().replace("\"", ""))) {
                item.setIsConnected(info.isConnected());
                item.setState(getStatusInSimpleEnglish(info.getDetailedState()));
            }
        }
        if (info.isConnected()) {
            mTimerHandler.removeCallbacks(mTimerRunnable);
        }
        if (info.isConnected() && info.getExtraInfo().equals(String.format("\"%s\"", mSelectedSSID))) {
            DebugLogger.d(TAG, "Connected to " + info.getExtraInfo());
            dismissProgressDialog();
            mSelectedSSID = "";
        }

        if (info.getState() == NetworkInfo.State.CONNECTED) {
            Collections.sort(mItems, new RssiComparator());
            putConnectedOnTop();
            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                  connectTOSignIn();
                }
            },1000);
        }
        if (info.getState() == NetworkInfo.State.CONNECTING) {
            Collections.sort(mItems, new RssiComparator());
            putConnectedOnTop();
        }
        notifyAdapter();
}

当我开始滚动应用程序时,堆栈跟踪会崩溃:-

[null]=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. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(2131624395, class android.widget.ListView) with Adapter(class android.widget.HeaderViewListAdapter)]
at android.widget.ListView.layoutChildren(ListView.java:1555)
at android.widget.AbsListView.onTouchMove(AbsListView.java:3549)
at android.widget.AbsListView.onTouchEvent(AbsListView.java:3424)
at android.view.View.dispatchTouchEvent(View.java:7706)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2069)
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1516)
at android.app.Activity.dispatchTouchEvent(Activity.java:2485)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2017)
at android.view.View.dispatchPointerEvent(View.java:7886)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3956)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3835)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3401)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3451)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3420)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3527)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3428)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3584)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3401)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3451)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3420)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3428)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3401)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5604)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5584)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5555)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5684)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.java:138)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604)
at dalvik.system.NativeStart.main(Native Method)

我在 UI 线程中发出通知:-

private  void notifyAdapter()  {
   mActivity.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            homeWifiListAdapter.notifyDataSetChanged();
            }
    });
}

非常感谢任何建议,谢谢。

【问题讨论】:

  • 可能缺少将新数据传递给 listview 的部分?
  • @Simone Leoni 感谢您的回复,实际上列表是全局列表,没有在更改中创建列表。
  • 方法connectTOSignIn() 会改变你的mItems 吗?但是我认为你不能做这样的事情,你正在修改列表视图中存储和使用的东西。将新数据传递给您的适配器应该可以解决问题! (然后叫了大名鼎鼎的notifyDataSetChanged()
  • @Simone Leoni 不,我没有在 connectTOSignIn() 方法中执行任何与列表相关的内容。
  • - 重复我自己:) - 我认为你不能做这样的事情,你正在修改列表视图中存储和使用的东西。将新数据传递给您的适配器应该可以解决问题! (然后调用了著名的 notifyDataSetChanged()

标签: android android-listview android-wifi


【解决方案1】:

要仅更新列表视图中的一行,您可以尝试一下 -> answer

那个把戏是罗马人给的

【讨论】:

    猜你喜欢
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多