Как установить серый фон для всех элементов RecyclerView на Swiped? - PullRequest
0 голосов
/ 08 июля 2020

ОБНОВЛЕНИЕ Когда I Log.i("adapterPos", String.valueOf(adapter.adapterPos)); в onSwiped, он возвращает -1 даже до установки -1 ...

У меня есть recyclerView, а также custom adapter для отображения информации об упражнении.

приложение

Когда пользователь нажимает на элемент recyclerView, фон элементов становится зеленым, а кнопка сохранения превращается в кнопку обновления, так что пользователь может обновить свои существующие записанные упражнения.

У меня также есть метод onSwiped, который реализован внутри моего фрагмента. Когда пользователь проводит пальцем по элементу, он удаляется из базы данных.

Когда пользователь проводит пальцем, чтобы удалить элемент, я хотел бы вернуть фон для ВСЕХ элементов обратно на значение по умолчанию (серый).

Как это можно сделать?

Примечание: если выбран элемент 2 и пользователь решает провести элемент 1, даже после удаления элемента 1 элемент 2 все еще выбран .

Фрагмент записи упражнения (Соответствующий код)

@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;
        }
    }

    public void initRecyclerView() {
        adapter = new CompletedExercisesListAdapter2(allExercises, this);
        recyclerView.setAdapter(adapter);
        new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);
    }

    public void setExercises(List<Log_Entries> exercises) {
        allExercises.clear();
        allExercises.addAll(exercises);
    }

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

 Log.i("adapterPos", String.valueOf(adapter.adapterPos));  // this is always -1 for some reason

            // backup the currently selected position
            int selectedPos = adapter.adapterPos;
            // change the currently selected position to -1
            adapter.adapterPos = -1;
            adapter.notifyItemChanged(selectedPos);

        }
    };

Адаптер

public class CompletedExercisesListAdapter2 extends RecyclerView.Adapter {

    private OnExerciseClickListener onExerciseClickListener;
    private List<Log_Entries> allCompletedExercises = new ArrayList<>();
    public int adapterPos = -1;
    public boolean isSelected = 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(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(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;
        }
    }

    public 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 (isSelected) {
                adapterPos = -1;
                isSelected = false;

            } else {
                adapterPos = getAdapterPosition();
                isSelected = 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 (!isSelected) {
                adapterPos = getAdapterPosition();
                isSelected = true;

            } else {
                adapterPos = -1;
                isSelected = 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;
    }
}

Ответы [ 2 ]

1 голос
/ 09 июля 2020

В onSwipe() просто сбросьте adapterPos вашего adapter объекта на -1 и вызовите notifyItemChanged() в этой позиции.

                // backup the currently selected position
                int selectedPos = adapter.adapterPos;
                // change the currently selected position to -1
                adapter.adapterPos = -1;
                adapter.isSelected = false;
                adapter.notifyItemChanged(selectedPos);  

Примечание: onSwipe() вызывается после того, как ViewHolder полностью пролистывается.

0 голосов
/ 13 июля 2020

Я думаю, единственное, что вам нужно сделать, чтобы это сработало, - это убедиться, что notifyDataSetChanged() выполняется один раз после того, как вы установили adapterpos= -1. notifyDataSetChanged() будет повторно запускать onBindViewHolder для всего адаптера, в отличие от notifyItemChanged(), что должно привести к тому, что все элементы будут оцениваться на сером фоне.

вы фактически уже делаете это в ваших зрителях onClick , чтобы предотвратить одновременное отображение зеленого фона у нескольких элементов. так что просто выполните метод снова после смахивания. так что просто сделайте следующее:

        @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");//<-- why if no item is selected?

        // backup the currently selected position
        //int selectedPos = adapter.adapterPos;<-- why would you do this, nothing is not shown as selected
        // change the currently selected position to -1
        adapter.adapterPos = -1;
        adapter.notifyDataSetChanged();//now everything will be gray

    }

это наверняка сработает, но это испортит анимацию удаления, которую вы можете использовать после смахивания. после предыдущего ответа другой код, который может работать, выглядит следующим образом:

        @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        int copyOfAdapterPos=adapterPos;
        adapterPos=-1;
        notifyItemChanged(copyOfAdapterPos);
        
        int logID = allExercises.get(viewHolder.getAdapterPosition()).getLog_id();
        logViewModel.deleteByID(logID);
        clearBtn.setVisibility(View.VISIBLE);
        saveBtn.setText("Save");//<-- why if no item is selected?

        adapter.notifyItemRemoved(viewHolder.getAdapterPosition());//now everything will be gray

    }

Я не тестировал его, но если он работает, он будет выглядеть лучше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...