[解決済み] Android RecyclerView : notifyDataSetChanged() IllegalStateException
質問
notifyDataSetChanged()を使って、recycleviewの項目を更新しようとしています。
これは、recycleviewアダプタのonBindViewHolder()メソッドです。
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
//checkbox view listener
viewHolder.getCheckbox().setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
//update list items
notifyDataSetChanged();
}
});
}
私がしたいことは、チェックボックスをチェックした後、リストアイテムを更新することです。しかし、私は不正な例外を取得します。
"Cannot call this method while RecyclerView is computing a layout or scrolling"
java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling
at android.support.v7.widget.RecyclerView.assertNotInLayoutOrScroll(RecyclerView.java:1462)
at android.support.v7.widget.RecyclerView$RecyclerViewDataObserver.onChanged(RecyclerView.java:2982)
at android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:7493)
at android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:4338)
at com.app.myapp.screens.RecycleAdapter.onRowSelect(RecycleAdapter.java:111)
notifyItemChanged()も使ってみましたが、同じ例外です。何かが変更されたことをアダプタに通知するために、何か秘密の更新方法がありますか?
どのように解決するのですか?
setOnCheckedChangeListener()メソッドをアダプタの内部クラスであるViewHolderに移動してください。
onBindViewHolder()
は初期化するメソッドではありません。
ViewHolder
.
このメソッドは、各リサイクラーアイテムをリフレッシュするためのステップです。
を呼び出すと
notifyDataSetChanged()
,
onBindViewHolder()
が呼び出されます。
ですから、もし
notifyDataSetChanged()
に入れる。
onCheckChanged()
でチェックボックスを初期化し
onBindViewHolder()
で初期化すると、循環的なメソッド呼び出しのため、IllegalStateExceptionが発生します。
click checkbox -> onCheckedChanged() -> notifyDataSetChanged() -> onBindViewHolder() -> set checkbox -> onChecked...
単純に、Adapterにフラグを一つ入れれば解決します。
これを試してみてください。
private boolean onBind;
public ViewHolder(View itemView) {
super(itemView);
mCheckBox = (CheckBox) itemView.findViewById(R.id.checkboxId);
mCheckBox.setOnCheckChangeListener(this);
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(!onBind) {
// your process when checkBox changed
// ...
notifyDataSetChanged();
}
}
...
@Override
public void onBindViewHolder(YourAdapter.ViewHolder viewHolder, int position) {
// process other views
// ...
onBind = true;
viewHolder.mCheckBox.setChecked(trueOrFalse);
onBind = false;
}
関連
-
Androidのadbデバイスがオフラインであることが判明
-
armeabi-v7a armeabi arm64-v8a パラメータの意味説明
-
ジャークとして。起動アクティビティを特定できませんでした。デフォルトのアクティビティが見つかりません アクティビティ起動中のエラー
-
アンドロイドプロジェクトのパッケージングにgradleを使用する際の問題点
-
Android のパッケージングに失敗し、Android リソースのリンクに失敗したことを示すプロンプトが表示される
-
アンドロイドスタジオでJunitのエラー問題を解決する
-
[解決済み] Androidのソフトキーボードをプログラムで閉じる/隠すにはどうすればよいですか?
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] Androidの「コンテキスト」とは何ですか?
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] RecyclerViewからアイテムを削除しようとすると、RecyclerViewがレイアウトを計算している間、またはスクロールしている間は、このメソッドを呼び出すことができません。
-
[android studio]com.android.ide.common.process.ProcessException: aaptの実行に失敗しました
-
Gradle の同期に失敗しました。com.android.tools.build:gradle が見つかりませんでした。
-
Android のパッケージングに失敗し、Android リソースのリンクに失敗したことを示すプロンプトが表示される
-
Android: インポートモジュールエラー Android リソースのリンクに失敗しました
-
ライブラリをモジュールとしてインポートする際にエラーが発生しました。Error:A problem occurred configuring project ':library'.
-
android exception - aapt.exe has stopped working.
-
Androidプロセス生存のためのソリューション
-
Android Get set image.setImageResource(R.drawable.xxx) リソース
-
Android Studio http://schemas.android.com/apk/res/android 「URIが登録されていません」の解決方法について