RecyclerView がレイアウトを計算しているとき、または RecyclerView からアイテムを削除しようとするときにスクロールしているときは、このメソッドを呼び出すことはできません。質問する

RecyclerView がレイアウトを計算しているとき、または RecyclerView からアイテムを削除しようとするときにスクロールしているときは、このメソッドを呼び出すことはできません。質問する

Recyclerviewからアイテムを削除しようとしているのですが、常にエラーが発生します

java.lang.IllegalStateException: RecyclerView がレイアウトを計算しているときやスクロールしているときは、このメソッドを呼び出すことはできません。

通知データセット変更を使用していますが、これを解決できますか?

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);

        }
    }
}

ベストアンサー1

以下の回答は私にとっては役立ちました

workaroundこれは問題に対するものです。

notifyDataSetChanged()これは通常、を呼び出すときに発生しますbackground thread。そのため、通知を に移動するだけで、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
 }
 });

おすすめ記事