1

I am working app in which, I have to show custom list of available wifi. for this I am getting List inside overrided method:

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

and from here, I call setAdapter. Once List is showing it's scrolling fine without any crash but when I click any list item for connecting that wifi provide password back to list following method is called:-

 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();
}

When I start scrolling app going to crash stack trace is as:-

[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)

I make notification inside UI thread as:-

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

Any suggestion is highly appreciated, thanks.

Sandeep Tiwari
  • 2,042
  • 3
  • 24
  • 47
  • Maybe it's missing the part where you pass the new data to listview? – Simone Leoni Oct 19 '15 at 10:55
  • @Simone Leoni thanks for your reply actually list is global list no list is created in change. – Sandeep Tiwari Oct 19 '15 at 11:00
  • Does the method `connectTOSignIn()` alter your `mItems`? However I think that you cannot do something like that, you are modifying something stored and used within the listview. Passing new data to your adapter should fix the issue! (And then called the famous `notifyDataSetChanged()` – Simone Leoni Oct 19 '15 at 11:07
  • @Simone Leoni no I doesn't perform any list related stuff in connectTOSignIn() method. – Sandeep Tiwari Oct 19 '15 at 12:09
  • - Repeating myself :) - I think that you cannot do something like that, you are modifying something stored and used within the listview. Passing new data to your adapter should fix the issue! (And then called the famous notifyDataSetChanged() – Simone Leoni Oct 19 '15 at 12:24
  • @Simone Leoni I want to same functionality like in-build wifi view in mobile which showing status like authentication..., connected etc... – Sandeep Tiwari Oct 19 '15 at 12:27

1 Answers1

-1

To update just one row in your listview you could give this a try -> answer

That trick was given by Roman Guy

Community
  • 1
  • 1
Simone Leoni
  • 316
  • 1
  • 9