Как обрабатывать изменения пользовательского интерфейса от взаимодействия с представлением при использовании RecyclerView? - PullRequest
0 голосов
/ 27 октября 2019

Если у нас есть RecyclerView, у которого будут представления различного типа, мы можем раздуть представление, которое нам нужно, на основе типа элемента, например

@Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) {
        View view = null;
        switch (type) {
            case TYPEX:  
               view = LayoutInflater
                    .from(viewGroup.getContext())
                    .inflate(R.layout.typex, viewGroup, false);
                    return new ViewHolderX(view);
            case TYPEY:
                view = LayoutInflater
                    .from(viewGroup.getContext())
                    .inflate(R.layout.typey, viewGroup, false);
                return new ViewHolderY(view);
        }
        return null;
    }

Пока все хорошо. В этом случае представления можно повторно использовать в представлении ViewHolder

. Вопрос:
Если в представлении TYPEX есть кнопка, которая при нажатии изменяет что-то в представлении, например цвет фона, это означает, что при повторном использовании представленияцвет будет другим для других элементов, для которых пользователь никогда не нажимал кнопку.
Как это можно исправить, поскольку это не будет связано с каким-либо состоянием данных, которые представление должно отображать с адаптера?

1 Ответ

1 голос
/ 27 октября 2019

Вам следует сохранить вашу собственность [ цвет фона ] внутри модели и принять решение на основе этого.

class Model {

    ...

    private int backgroundColor = 0xFFFFFF;

    public int getBackgroundColor() {
        return backgroundColor;
    }

    public void setBackgroundColor(int backgroundColor) {
        this.backgroundColor = backgroundColor;
    }

    ...

}

Обработайте щелчок здесь и обновите цвет фона.

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

    final Model model = modelItems.get(position);

    holder.rootView.setBackgroundColor(model.getBackgroundColor());

    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(model.getBackgroundColor() != 0xFFFF0000){
                model.setBackgroundColor(0xFFFF0000);
                notifyItemChanged(position);
            }
        }
    });
}

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

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