前提・実現したいこと
RecyclerView.AdapterのonBindViewHolder内でnotifyDataSetChangedに対するエラーの回避策について知りたいです。
Collections.sort(AlarmList)で、RecyclerViewに設定するArrayListの並び順がスイッチを押されることで変わることは確認しました。
その後、リサイクルビュー更新「notifyDataSetChanged()」で更新しようとしたところ、エラーが発生しました。
以下のページに同様の事象が報告されています。
Android RecyclerView : notifyDataSetChanged() IllegalStateException
具体的にどのように記述して対応すれば良いのでしょうか?
発生している問題・エラーメッセージ
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.a.b, PID: 10998 java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling android.support.v7.widget.RecyclerView{cf244b5 VFED..... .F....ID 0,125-1080,1727 #7f08006e app:id/lv_alarm}, adapter:com.a.b.AlarmsAdapter@d14974a, layout:android.support.v7.widget.LinearLayoutManager@51926bb, context:com.a.b.MainActivity@c1f5cf9 at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:2880) at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:5281) at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:11997) at android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:7070) at com.a.b.AlarmsAdapter.alarm_switch_upd(AlarmsAdapter.java:200)
該当のソースコード
java
1public class AlarmsAdapter extends RecyclerView.Adapter<AlarmsAdapter.ItemViewHolder> { 2・・・ 3 @Override 4 public void onBindViewHolder(final ItemViewHolder holder, final int position) { 5 //行の値設定 6 holder.sw_alarm.setChecked(AlarmList.get(position).m_sw_alarm); 7 holder.t_gozengogo.setText(AlarmList.get(position).m_t_gozengogo); 8 holder.t_time.setText(AlarmList.get(position).m_t_time); 9 holder.t_ampm.setText(AlarmList.get(position).m_t_ampm); 10 holder.t_alarm_name.setText(AlarmList.get(position).m_t_alarm_name); 11 holder.t_week.setText(AlarmList.get(position).m_t_week); 12 13 //アラームスイッチ変更 14 holder.sw_alarm.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 15 @Override 16 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 17 if(holder.sw_alarm.isChecked()) { 18 //mSwitch : Off -> On の時の処理 19 20 // コンテキスト取得 21 context = buttonView.getContext(); 22 //アラームスイッチ更新 23 alarm_switch_upd(holder.sw_alarm.isChecked() ,position); 24 } else { 25 //mSwitch : On -> Off の時の処理 26 27 // コンテキスト取得 28 context = buttonView.getContext(); 29 //アラームスイッチ更新 30 alarm_switch_upd(holder.sw_alarm.isChecked() ,position); 31 } 32 //アーリーリスト再ソート 33 Collections.sort(AlarmList); 34 35 //リサイクルビュー更新 36 notifyDataSetChanged(); 37 } 38 }); 39 } 40
補足情報(FW/ツールのバージョンなど)
Android Studio3.4
API14から28対象ターゲット28
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/21 13:15
2019/08/21 14:33
2019/08/21 14:36
2019/08/21 14:45
2019/08/21 15:04
2019/08/21 15:09