gregkorossy / Android-Support-Preference-V7-Fix

Android androidx.preference support library has some issues, this lib tries to fix them.
https://discord.gg/87NVsSK
Apache License 2.0
497 stars 46 forks source link

Crashes in SwitchPreferencesCompat #44

Closed saquer0716 closed 7 years ago

saquer0716 commented 8 years ago

Got some crashes from SwitchPreferencesCompat:

java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java) at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onItemRangeChanged(RecyclerView.java) at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyItemRangeChanged(RecyclerView.java) at android.support.v7.widget.RecyclerView$Adapter.notifyItemChanged(RecyclerView.java) at android.support.v7.preference.PreferenceGroupAdapter.onPreferenceChange(PreferenceGroupAdapter.java) at android.support.v7.preference.Preference.notifyChanged(Preference.java) at android.support.v7.preference.TwoStatePreference.setChecked(TwoStatePreference.java) at com.takisoft.fix.support.v7.preference.SwitchPreferenceCompat.setChecked(SwitchPreferenceCompat.java) at android.support.v7.preference.SwitchPreferenceCompat$Listener.onCheckedChanged(SwitchPreferenceCompat.java) at android.widget.CompoundButton.setChecked(CompoundButton.java:165) at android.support.v7.widget.SwitchCompat.setChecked(SwitchCompat.java) at com.takisoft.fix.support.v7.preference.SwitchPreferenceCompat.onBindViewHolder(SwitchPreferenceCompat.java)

This came from developer console and I can't reproduce it from my test devices. Could it be the animation when switching state?

gregkorossy commented 8 years ago

It seems like it, but it's really difficult to reproduce. Is this a Switch that is not visible on the screen first but you have to scroll down a bit to reveal it?

proninyaroslav commented 7 years ago

Hello. I have the same problem (during switching):

java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2397)
at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onItemRangeChanged(RecyclerView.java:4626)
at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyItemRangeChanged(RecyclerView.java:10462)
at android.support.v7.widget.RecyclerView$Adapter.notifyItemChanged(RecyclerView.java:6149)
at android.support.v7.preference.PreferenceGroupAdapter.onPreferenceChange(PreferenceGroupAdapter.java:219)
at android.support.v7.preference.Preference.notifyChanged(Preference.java:1061)
at android.support.v7.preference.TwoStatePreference.setChecked(TwoStatePreference.java:82)
at com.takisoft.fix.support.v7.preference.SwitchPreferenceCompat.setChecked(SwitchPreferenceCompat.java:40)
at android.support.v7.preference.SwitchPreferenceCompat$Listener.onCheckedChanged(SwitchPreferenceCompat.java:57)
at android.widget.CompoundButton.setChecked(CompoundButton.java:156)
at android.support.v7.widget.SwitchCompat.setChecked(SwitchCompat.java:1061)
at com.takisoft.fix.support.v7.preference.SwitchPreferenceCompat.onBindViewHolder(SwitchPreferenceCompat.java:34)
at android.support.v7.preference.PreferenceGroupAdapter.onBindViewHolder(PreferenceGroupAdapter.java:316)
at android.support.v7.preference.PreferenceGroupAdapter.onBindViewHolder(PreferenceGroupAdapter.java:37)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5825)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5858)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5094)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4970)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2029)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1414)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1377)
at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1193)
at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1043)
at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:4413)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
at android.view.Choreographer.doCallbacks(Choreographer.java:670)
at android.view.Choreographer.doFrame(Choreographer.java:603)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5461)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:102)
gregkorossy commented 7 years ago

Can you provide a test preferences XML for this? I couldn't reproduce the problem.

proninyaroslav commented 7 years ago

@Gericop I also don't see any problem, but I get a bug reports from users who use a switch button in the settings.

java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2397)
at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onItemRangeChanged(RecyclerView.java:4626)
at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyItemRangeChanged(RecyclerView.java:10462)
at android.support.v7.widget.RecyclerView$Adapter.notifyItemChanged(RecyclerView.java:6149)
at android.support.v7.preference.PreferenceGroupAdapter.onPreferenceChange(PreferenceGroupAdapter.java:219)
at android.support.v7.preference.Preference.notifyChanged(Preference.java:1061)
at android.support.v7.preference.TwoStatePreference.setChecked(TwoStatePreference.java:82)
at com.takisoft.fix.support.v7.preference.SwitchPreferenceCompat.setChecked(SwitchPreferenceCompat.java:40)
at android.support.v7.preference.SwitchPreferenceCompat$Listener.onCheckedChanged(SwitchPreferenceCompat.java:57)
at android.widget.CompoundButton.setChecked(CompoundButton.java:156)
at android.support.v7.widget.SwitchCompat.setChecked(SwitchCompat.java:1061)
at com.takisoft.fix.support.v7.preference.SwitchPreferenceCompat.onBindViewHolder(SwitchPreferenceCompat.java:34)
at android.support.v7.preference.PreferenceGroupAdapter.onBindViewHolder(PreferenceGroupAdapter.java:316)
at android.support.v7.preference.PreferenceGroupAdapter.onBindViewHolder(PreferenceGroupAdapter.java:37)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:5825)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:5858)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5094)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4970)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2029)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1414)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1377)
at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1193)
at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1043)
at android.support.v7.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:4413)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
at android.view.Choreographer.doCallbacks(Choreographer.java:670)
at android.view.Choreographer.doFrame(Choreographer.java:603)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5525)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
gregkorossy commented 7 years ago

@saquer0716 and @proninyaroslav: I might have fixed this bug. Please try the new version (v25.0.0.1) and tell me if it got fixed or you still get error reports.

virusman commented 7 years ago

This is not fixed in 25.0.1.0

virusman commented 7 years ago

Oh, nevermind, I have a different crash

gregkorossy commented 7 years ago

Is this bug still present, @saquer0716 and @proninyaroslav?