0

我有一个带有 recyclerView 的片段。

1

用户可以logEntry通过向右滑动来删除锻炼。

2

用户还可以logEntry通过单击 recyclerView 项来更新 a。(这会将当前选定的项目突出显示为绿色,隐藏清除按钮并将保存按钮转换为更新按钮。)

3

要取消选择该项目,用户可以再次单击 recyclerView。

4

不幸的是,如果用户要选择一个项目,然后决定滑动删除一个项目,则与最初选择的项目处于相同位置的 recyclerView 项目将保持绿色突出显示。

当用户滑动删除项目时,我希望将所有 recyclerView 项目的背景重置为灰色。

怎么可能做到这一点?

相关片段代码

OnExerciseClicked

@Override
    public void onExerciseClicked(int position) {
        if (recyclerItemClicked == false) {
            saveBtn.setText("Update");
            clearBtn.setVisibility(View.GONE);
            recyclerItemClicked = true;
            double selectedWeight = adapter.getWeight(position);
            String selectedWeightString = Double.toString(selectedWeight);
            editTextWeight.setText(selectedWeightString);

            int selectedReps = adapter.getReps(position);
            String selectedRepsString = Integer.toString(selectedReps);
            editTextReps.setText(selectedRepsString);

        } else {
            clearBtn.setVisibility(View.VISIBLE);
            saveBtn.setText("Save");
            recyclerItemClicked = false;
        }
    }

OnSwiped

ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {

            int logID = allExercises.get(viewHolder.getAdapterPosition()).getLog_id();
            logViewModel.deleteByID(logID);
            clearBtn.setVisibility(View.VISIBLE);
            saveBtn.setText("Save");
            adapter.notifyDataSetChanged();
        }
    };

适配器

public class CompletedExercisesListAdapter2 extends RecyclerView.Adapter {

    private OnExerciseClickListener onExerciseClickListener;
    private List<Log_Entries> allCompletedExercises = new ArrayList<>();
    private int adapterPos = -1;

    public boolean flag = false;

    public CompletedExercisesListAdapter2(ArrayList<Log_Entries> allCompletedExercises, OnExerciseClickListener onExerciseClickListener) {
        this.allCompletedExercises = allCompletedExercises;
        this.onExerciseClickListener = onExerciseClickListener;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view;

        if (viewType == 0) {
            view = layoutInflater.inflate(R.layout.new_completed_exercise_item, parent, false);
            return new ViewHolderOne(view, onExerciseClickListener);
        }

        view = layoutInflater.inflate(R.layout.completed_exercise_item, parent, false);
        return new ViewHolderTwo(view, onExerciseClickListener);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

        if (getItemViewType(position) == 0) {
            ViewHolderOne viewHolderOne = (ViewHolderOne) holder;

            if (adapterPos == position) {
                viewHolderOne.relativeLayout.setBackgroundColor(Color.parseColor("#567845"));
            } else {
                viewHolderOne.relativeLayout.setBackgroundResource(R.color.dark_grey);
            }

            viewHolderOne.textViewExerciseName.setText(String.valueOf(allCompletedExercises.get(position).getChildExerciseName()));
            //viewHolderOne.textViewSetNumber.setText(String.valueOf(allCompletedExercises.get(position).getSet_number()));
            viewHolderOne.textViewSetNumber.setText(String.valueOf(viewHolderOne.getAdapterPosition() + 1));
            viewHolderOne.textViewWeight.setText(String.valueOf(allCompletedExercises.get(position).getTotal_weight_lifted()));
            viewHolderOne.textViewReps.setText(String.valueOf(allCompletedExercises.get(position).getReps()));

        } else if (getItemViewType(position) == 1) {
            ViewHolderTwo viewHolderTwo = (ViewHolderTwo) holder;

            if (adapterPos == position) {
                viewHolderTwo.relativeLayout.setBackgroundColor(Color.parseColor("#567845"));
            } else {
                viewHolderTwo.relativeLayout.setBackgroundResource(R.color.dark_grey);
            }
            //  viewHolderTwo.textViewSetNumber.setText(String.valueOf(allCompletedExercises.get(position).getSet_number()));
            viewHolderTwo.textViewSetNumber.setText(String.valueOf(viewHolderTwo.getAdapterPosition() + 1));
            viewHolderTwo.textViewWeight.setText(String.valueOf(allCompletedExercises.get(position).getTotal_weight_lifted()));
            viewHolderTwo.textViewReps.setText(String.valueOf(allCompletedExercises.get(position).getReps()));
        }
    }

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

    @Override
    public int getItemViewType(int position) {

        // if list is sorted chronologically
        if (position == 0) {
            return 0;
        }
        if (allCompletedExercises.get(position).getChildExerciseName().equals(allCompletedExercises.get(position - 1).getChildExerciseName())) {
            return 1;
        } else {
            return 0;
        }
    }

    class ViewHolderOne extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView textViewExerciseName;
        private TextView textViewSetNumber;
        private TextView textViewWeight;
        private TextView textViewReps;

        OnExerciseClickListener mOnExerciseClickListener;

        private RelativeLayout relativeLayout;

        public ViewHolderOne(@NonNull View itemView, OnExerciseClickListener onExerciseClickListener) {
            super(itemView);

            textViewExerciseName = itemView.findViewById(R.id.textView_ExerciseName3);
            textViewSetNumber = itemView.findViewById(R.id.textView_Set_Number56);
            textViewWeight = itemView.findViewById(R.id.textView_weight78);
            textViewReps = itemView.findViewById(R.id.textView_repss0);
            mOnExerciseClickListener = onExerciseClickListener;
            relativeLayout = (RelativeLayout) itemView.findViewById(R.id.exercise_item_relative);
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            onExerciseClickListener.onExerciseClicked(getAdapterPosition());
            if (flag) {
                adapterPos = -1;
                flag = false;
            } else {
                adapterPos = getAdapterPosition();
                flag = true;
            }
            notifyDataSetChanged();
        }
    }

    class ViewHolderTwo extends RecyclerView.ViewHolder implements View.OnClickListener {
        private TextView textViewSetNumber;
        private TextView textViewWeight;
        private TextView textViewReps;
        OnExerciseClickListener mOnExerciseClickListener;
        private RelativeLayout relativeLayout;

        public ViewHolderTwo(@NonNull View itemView, OnExerciseClickListener onExerciseClickListener) {
            super(itemView);
            textViewSetNumber = itemView.findViewById(R.id.textView_Set_Number);
            textViewWeight = itemView.findViewById(R.id.textView_weight);
            textViewReps = itemView.findViewById(R.id.textView_repss);
            relativeLayout = (RelativeLayout) itemView.findViewById(R.id.exercise_item_rel);
            mOnExerciseClickListener = onExerciseClickListener;
            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            onExerciseClickListener.onExerciseClicked(getAdapterPosition());

            if (!flag) {
                adapterPos = getAdapterPosition();
                flag = true;
            } else {
                adapterPos = -1;
                flag = false;
            }
            notifyDataSetChanged();
        }
    }

    public interface OnExerciseClickListener {
        void onExerciseClicked(int position);
    }
    public double getWeight(int position) {
        double weight = allCompletedExercises.get(position).getTotal_weight_lifted();
        return weight;
    }
    public int getReps(int position) {
        int reps = allCompletedExercises.get(position).getReps();
        return reps;
    }
}
4

1 回答 1

1

我强烈建议使用像 Groupie 这样的库来抽象出 RecyclerView 的复杂状态管理。否则,您会发现这种命令式风格很快变得无法维护。未来是声明式 UI(Compose 等)。这样,跟踪项目而不是位置要容易得多。

遵循您的代码非常困难(您应该为事物使用描述性名称,例如isSelected代替flag)。但是我认为你的问题在于你的绑定函数在这里没有返回 false:

if (adapterPos == position)

刷卡后。使用断点找出原因

于 2020-07-06T06:00:58.290 回答