[解決済み] RecyclerViewからアイテムを削除しようとすると、RecyclerViewがレイアウトを計算している間、またはスクロールしている間は、このメソッドを呼び出すことができません。
2022-02-19 08:21:13
質問
リサイクルビューからアイテムを削除しようとしているのですが、いつもエラーが発生します。
java.lang.IllegalStateException: このメソッドを呼び出すことはできません。 RecyclerViewはレイアウトを計算しているか、スクロールしています。
notify datasetchanged を使っているのですが、これを解決できますか?
public class AdapterIntransit extends RecyclerView.Adapter<AdapterIntransit.ViewHolder> {
private Context context;
List<DataIntransit> data;
public AdapterIntransit(Context context, List<DataIntransit> data) {
this.context = context;
this.data = data;
}
@Override
public AdapterIntransit.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardintransit, parent, false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(AdapterIntransit.ViewHolder holder, int position) {
if (data.get(position).getJml1() - data.get(position).getJml2() <= 0) {
data.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, getItemCount());
notifyDataSetChanged();
} else {
holder.kode.setText(data.get(position).getKode());
holder.nama.setText(data.get(position).getNama());
holder.jumlah.setText(String.valueOf(data.get(position).getJml1() - data.get(position).getJml2()));
}
}
@Override
public int getItemCount() {
return data.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
TextView kode, nama, jumlah;
public ViewHolder(View itemView) {
super(itemView);
kode = (TextView)itemView.findViewById(R.id.kode);
nama = (TextView)itemView.findViewById(R.id.nama);
jumlah = (TextView)itemView.findViewById(R.id.jumlah);
}
}
}
解決方法は?
以下の回答は私にとって効果的でした。
これはまさに
workaround
を問題視しています。
この現象は、通常
notifyDataSetChanged()
の上で
background thread
. そこで、notify を
UI thread
recyclerView.post(new Runnable()
{
@Override
public void run() {
myadapter.notifyDataSetChanged();
}
});
あなたは、あなたの
RecyclerView
インスタンスを作成し、postメソッド内で新しいRunnableをメッセージキューに追加しています。Runnableはユーザーインターフェイスのスレッドで実行されます。これは、Android がアクセスするための制限でUI
スレッドで実行されるメソッドの内部など)。 で実行すると、より多くのUI
を使用します。
で実行することができます。
UI
スレッドが必要な場合は
runOnUiThread(new Runnable(){
public void run() {
// UI code goes here
}
});
関連
-
[解決済み】Android TextView : "setTextで表示されたテキストを連結しない" について
-
[解決済み】Edit Textのandroid:ems属性とは何ですか?[重複しています]
-
[解決済み】このアクティビティは、すでにウィンドウ装飾によって提供されるアクションバーを持っています。
-
[解決済み】apkファイルのインストール中に「パッケージが破損しているようです」というエラーが発生する。
-
[解決済み】カメラサービスへの接続に失敗しました。
-
[解決済み] Mockito lenient() を使用する場合
-
[解決済み] エラー - Android リソースのリンクに失敗しました (AAPT2 27.0.3 Daemon #0)
-
[解決済み] AndroidでBluetoothが有効かどうかのチェックに失敗する(REQUEST_ENABLE_BTを変数に解決できない)。
-
[解決済み] setBackgroundDrawable() 非推奨
-
[解決済み] Android Fragment onAttach() 非推奨
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】まだ警告が出る:設定 'compile' は時代遅れで 'implementation' に置き換わった。
-
[解決済み】Android Studioでマニフェストのマージに失敗し、複数のエラーが発生した。
-
[解決済み】Android Studioで最新バージョンのgradleを使用する方法
-
[解決済み] SDKの場所がandroid studioで見つからない
-
[解決済み] Xlint:deprecationを使用して再コンパイルする方法
-
[解決済み] Gradle DSL メソッドが見つかりません:'compile()'
-
[解決済み] ADBエラー:デーモンに接続できない
-
[解決済み] Android M パーミッション : shouldShowRequestPermissionRationale()関数の使用方法について混乱しています。
-
[解決済み] Android RecyclerViewのアイテム追加・削除について
-
[解決済み] Android RecyclerView : notifyDataSetChanged() IllegalStateException