Tousif Akram
Tousif Akram

Reputation: 11

(listAdapter as WiFiPeerListAdapter).notifyDataSetChanged() Causing Crash

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    listAdapter = WiFiPeerListAdapter(requireContext(), R.layout.row_devices, peers)
}

causing crash while casting as below:

   fun clearPeers() {
    peers.clear()
    (listAdapter as WiFiPeerListAdapter).notifyDataSetChanged()
}

here list adapter is setListAdapter() from ListFragment() class:

  public void setListAdapter(@Nullable ListAdapter adapter) {
    boolean hadAdapter = mAdapter != null;
    mAdapter = adapter;
    if (mList != null) {
        mList.setAdapter(adapter);
        if (!mListShown && !hadAdapter) {
            // The list was hidden, and previously didn't have an
            // adapter.  It is now time to show it.
            setListShown(true, requireView().getWindowToken() != null);
        }
    }
}

Crash Report:

FATAL EXCEPTION: main Process: com.tsfapps.wifip2p, PID: 29222 java.lang.RuntimeException: Error receiving broadcast Intent { act=android.net.wifi.p2p.CONNECTION_STATE_CHANGE flg=0x24000010 (has extras) } in com.tsfapps.wifip2p.WiFiDirectBroadcastReceiver@b154cba at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1689) at android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0.run(Unknown Source:2) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7839) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) Caused by: java.lang.NullPointerException: null cannot be cast to non-null type com.tsfapps.wifip2p.DeviceListFragment.WiFiPeerListAdapter at com.tsfapps.wifip2p.DeviceListFragment.clearPeers(DeviceListFragment.kt:102) at com.tsfapps.wifip2p.MainActivity.resetData(MainActivity.kt:159) at com.tsfapps.wifip2p.WiFiDirectBroadcastReceiver.onReceive(WiFiDirectBroadcastReceiver.kt:77) at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1679) at android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0.run(Unknown Source:2)  at android.os.Handler.handleCallback(Handler.java:938)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loopOnce(Looper.java:201)  at android.os.Looper.loop(Looper.java:288)  at android.app.ActivityThread.main(ActivityThread.java:7839)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 

I tried to search in Goolge, but not got any proper solution

Upvotes: 0

Views: 81

Answers (1)

Muhammad Hamza
Muhammad Hamza

Reputation: 82

The crash you face is caused by a NullPointerException when cast the listAdapter to WifiPeerListAdaptor . The exception occurs because the listAdapter are null the time of casting.

To fix the crash listAdapter is properly initialized before calling the clearPeer() function.

Here is an Example

private lateinit var listAdapter: WiFiPeerListAdapter 

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    listAdapter = WiFiPeerListAdapter(requireContext(), R.layout.row_devices, peers)

    // Other code...
}

fun clearPeers() {
    peers.clear()

    // Check if listAdapter is initialized

    if (::listAdapter.isInitialized) { 
        listAdapter.notifyDataSetChanged()
    }
}

Upvotes: 0

Related Questions