RecyclerView
からアイテムを削除しようとしていますが、常にエラーが発生します。
Java.lang.IllegalStateException:RecyclerViewがレイアウトを計算している間、またはスクロールしている間は、このメソッドを呼び出すことはできません
notifyDataSetChanged()
を使用しています。どうすればこれを解決できますか?
これが私のアダプタコードです
public class ListAdapters extends RecyclerView.Adapter<ListAdapters.MyViewHolder> {
public ArrayList<String> tvdatalist;
Context c;
int pos;
ListAdapters.MyViewHolder myViewHolder;
private LayoutInflater layoutInflater;
int[] arr;
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public EditText edttxt;
public CheckBox cb;
public MyViewHolder(View view) {
super(view);
edttxt = (EditText) view.findViewById(R.id.edttxt);
cb = (CheckBox) view.findViewById(R.id.cb);
}
@Override
public void onClick(View v) {
}
}
public ListAdapters(Context c, ArrayList<String> tvdatalist) {
this.c = c;
this.layoutInflater = LayoutInflater.from(c);
this.tvdatalist = tvdatalist;
arr = new int[tvdatalist.size()];
for (int i = 0; i < 20; i++) {
arr[i] = 0;
}
}
@Override
public ListAdapters.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ListAdapters.MyViewHolder(this.layoutInflater.inflate(R.layout.list_ittm, parent, false));
//return new LandingPageAdapter.MyViewHolder(itemView);
}
public void onBindViewHolder(final ListAdapters.MyViewHolder holder, final int position) {
myViewHolder = holder;
final String ShowsBean = tvdatalist.get(position);
myViewHolder.edttxt.setText(ShowsBean);
if (arr[pos] == 0) {
myViewHolder.cb.setChecked(false);
myViewHolder.edttxt.setKeyListener(null);
} else {
myViewHolder.cb.setChecked(true);
myViewHolder.edttxt.setFocusable(true);
}
myViewHolder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (arr[position]==0){
arr[position]=1;
}else{
arr[position]=0;
}
notifyDataSetChanged();
}
});
}
@Override
public int getItemCount() {
return tvdatalist.size();
}
public interface ItemClickListener {
void onClick(View view, int position, boolean isLongClick);
}
}
アッバスが言ったように
これは通常、bgスレッドでnotifyを呼び出しているときに発生します。したがって、通知をUIスレッドに移動するだけです
それ以外の場合は、notifyItemChanged(position);
を使用できます
これも同様に機能します。
Runnableを使用してUIスレッドを変更することもできます。
recyclerView.post(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
これにより、UIスレッドでアダプターの変更が通知されます。
この問題は、アイテムがまだ膨らんでいるときにrecyclerviewを更新しようとしているときに、notifyItemChanged(position)を移動して、アイテムがビューに追加されていることを確認してから、メソッド(notifyItemChanged(position))を呼び出すことを示しています。 );