当前位置: 首页 > 知识库问答 >
问题:

RecycerView根据复选框将项目移动到结束

罗新
2023-03-14
    private class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder>{

    protected class ViewHolder extends RecyclerView.ViewHolder
    {
        TextView todoTextView;
        TextView addedOnTextView;
        TextView dueToDateTextView;
        TextView dueToHourTextView;
        CheckBox checkBox;
        protected ViewHolder(CardView cv)
        {
            super(cv);
            this.todoTextView = (TextView) cv.findViewById(R.id.todo_text);
            this.addedOnTextView = (TextView) cv.findViewById(R.id.added_on);
            this.dueToDateTextView = (TextView) cv.findViewById(R.id.due_to_date);
            this.dueToHourTextView = (TextView) cv.findViewById(R.id.due_to_hour);
            this.checkBox = (CheckBox)cv.findViewById(R.id.checkbox);
        }
    }
    private final String[] COLORS = {"#64B5F6", "#F44336"};
    private ArrayList<Todo> mTodos;

    public Adapter()
    {
        this.mTodos = new ArrayList<>();
    }

    public void addItem(Todo message)
    {
        this.mTodos.add(message);
        notifyItemInserted(getItemCount());
    }

    @Override
    public int getItemCount() {
        return mTodos.size();
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        CardView cView = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.todolist_item,
                parent, false);
        cView.setCardBackgroundColor(Color.parseColor(COLORS[viewType]));
        ViewHolder hView = new ViewHolder(cView);
        return hView;
    }

    @Override
    public int getItemViewType(int position) {
        return position % 2;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        final Todo currentTodo = mTodos.get(position);

        holder.todoTextView.setText(currentTodo.getmTodo());
        holder.dueToDateTextView.setText(currentTodo.getDueToDate());
        holder.dueToHourTextView.setText(currentTodo.getDueToHour());
        holder.addedOnTextView.setText(currentTodo.getAddedStr());
        holder.checkBox.setChecked(currentTodo.isChecked());
        final int myPos = holder.getAdapterPosition();
        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                currentTodo.setChecked();
                buttonView.setEnabled(false);
                mTodos.add(mTodos.remove(myPos));
                notifyDataSetChanged();
            }
        });
    }
java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling

有人能帮我做那项任务吗?

共有1个答案

段干瑞
2023-03-14

您应该在viewHolder中移动您的逻辑:

private class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder>{
    protected class ViewHolder extends RecyclerView.ViewHolder
    {
        TextView todoTextView;
        TextView addedOnTextView;
        TextView dueToDateTextView;
        TextView dueToHourTextView;
        CheckBox checkBox;
        protected ViewHolder(CardView cv)
        {
            super(cv);
            this.todoTextView = (TextView) cv.findViewById(R.id.todo_text);
            this.addedOnTextView = (TextView) cv.findViewById(R.id.added_on);
            this.dueToDateTextView = (TextView) cv.findViewById(R.id.due_to_date);
            this.dueToHourTextView = (TextView) cv.findViewById(R.id.due_to_hour);
            this.checkBox = (CheckBox)cv.findViewById(R.id.checkbox);
            this.checkBox.setOnCheckChangeListener(this);
        }

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            Todo currentTodo = mTodos.get(getAdapterPosition());
            if(!onBind) {
                currentTodo.setChecked();
                buttonView.setEnabled(false);
                mTodos.add(mTodos.remove(getAdapterPosition()));
                notifyDataSetChanged();
            }
         }
    }
    private final String[] COLORS = {"#64B5F6", "#F44336"};
    private ArrayList<Todo> mTodos;
    public Adapter()
    {
        this.mTodos = new ArrayList<>();
    }
    public void addItem(Todo message)
    {
        this.mTodos.add(message);
        notifyItemInserted(getItemCount());
    }
    @Override
    public int getItemCount() {
        return mTodos.size();
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        CardView cView = (CardView) LayoutInflater.from(parent.getContext()).inflate(R.layout.todolist_item,
                parent, false);
        cView.setCardBackgroundColor(Color.parseColor(COLORS[viewType]));
        ViewHolder hView = new ViewHolder(cView);
        return hView;
    }
    @Override
    public int getItemViewType(int position) {
        return position % 2;
    }
    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        final Todo currentTodo = mTodos.get(position);
        holder.todoTextView.setText(currentTodo.getmTodo());
        holder.dueToDateTextView.setText(currentTodo.getDueToDate());
        holder.dueToHourTextView.setText(currentTodo.getDueToHour());
        holder.addedOnTextView.setText(currentTodo.getAddedStr());
        holder.checkBox.setChecked(currentTodo.isChecked());

    }

我现在不能尝试,让我知道是否在帮你。

对不起我的英语。

 类似资料:
  • 问题内容: 我是Linux新手。我正在尝试编写一个shell脚本,该脚本将 根据文件的扩展 名将 文件移动到某些文件夹 ,例如在我的downloads文件夹中,我具有混合文件类型的所有文件。我写了以下脚本 将文件添加到此文件夹后,如何使其自动运行?现在,我必须每次手动运行脚本。 还有一个问题,有什么办法可以合并这两个语句 成为一个陈述?我尝试使用(C编程“或”运算符)和逗号,但它们似乎不起作用。

  • 当我滚动RecycerView时,它正在复制项,并且我已经调用。 所以,可能我在错误的地方调用了数据集更新,但我找不到它是如何工作的。 下面是一些代码:

  • 正如您在这里看到的:JSFiddle

  • 我有一个,它具有和滚动。因为,这是一个带有的网格。为什么?因为它比中的简单要优化得多。 这一行需要与列表项滚动。 有人知道怎么做吗?我可以在项目上方添加一个新层吗?

  • 我有一个复选框,其中有一对项目,当我单击该复选框时,该项目将添加到名为currentDevice的状态,但当我取消选中该项目时,它将保留“添加项目”,而不是删除它。 当我取消选中该框时,如何从状态中删除项。Im使用“反应本机元素”复选框。谢谢你 代码:

  • 我目前正在工作Java/Selenium webdriver自动化。然而,我被困在这个特定的部分,我无法使webdriver点击基于值的复选框。 当我不使用xpath的Axes部分时,它可以工作,但是它只能选中第一个复选框 下面是html的一个片段