【问题标题】:IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrollingIllegalStateException:当 RecyclerView 正在计算布局或滚动时无法调用此方法
【发布时间】:2017-07-26 10:52:18
【问题描述】:

我试图从我的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 线程。
  • 找不到你。你能描述一下吗?
  • 实在想不出别的形容词了。无论您在哪里调用 notifyDataSetChanged()(似乎在后台线程上),都将其移动到 UI 线程。如果您不知道后台线程和 UI 线程之间的区别,请进行一些研究。

标签: android android-recyclerview illegalstateexception


【解决方案1】:

正如阿巴斯所说

这通常发生在您在 bg 线程上调用 notify 时。所以只需将通知移动到 ui 线程

否则你可以使用notifyItemChanged(position);

这也可以。

【讨论】:

  • 我也在 onbinholder 类中使用了这个,但应用程序仍然崩溃并给出这个错误
【解决方案2】:

您还可以使用 runnable 对 UI 线程进行更改。

recyclerView.post(new Runnable() {
    @Override
    public void run() {
        notifyDataSetChanged();
    }
});

这将通知 UI 线程上的适配器更改。

【讨论】:

    【解决方案3】:

    此问题显示,当您尝试更新 recyclerview 时它仍在膨胀项目,尝试将 notifyItemChanged(position) 移动到您确定项目已添加到视图中的位置,然后再调用 - 方法(notifyItemChanged (位置));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多