ViewHolders учитывается только при прокрутке - PullRequest
0 голосов
/ 16 апреля 2019

Я новичок в Recyclerviews и пытаюсь изменить viewHolder из функции вне OnBindViewHolder (я собираюсь изменить цвет фона viewHolder).

я пытался: - чтобысохраните ViewHolders в массиве ViewHolders и измените их.- чтобы получить вид из окна переработчика напрямую.- получить держатель вид по идентификатору напрямую и изменить его.И многое другое ... Все, что я пробовал, не удалось, и я обнаружил, что некоторые представления работают, и мне удалось изменить их цвета, но затем я получаю сообщение об ошибке, сообщающее, что некоторые представления являются нулевыми.я попытался добавить свое представление из onBindViewHolder, но кажется, что мои представления вызываются несколько раз при прокрутке.Мое последнее решение - добавить в список видоискатель из метода onCreateViewHolder.По какой-то причине кажется, что ViewHolders сохраняются, когда просмотрщик полностью прокручивается, и я понятия не имею, что происходит .. пожалуйста, помогите.это код для метода OncreateViewHolder:

@ Переопределить общедоступный RecyclerView.ViewHolder onCreateViewHolder (родительский элемент ViewGroup, int viewType) {

    View view ;
    switch (viewType) {
        case item_nature.IF_TYPE:
           view = LayoutInflater.from(parent.getContext()).inflate(R.layout.if_layout, parent, false);


            IFViewHolder v = new IFViewHolder(view);
            Holders.add(v);

            return  v;
        case item_nature.ELSE_TYPE:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.else_layout, parent, false);


            ELSEViewHolder v1 = new ELSEViewHolder(view);
            Holders.add(v1);

            return  v1;
        case item_nature.THEN_TYPE:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.then_layout, parent, false);

            THENViewHolder v2 = new THENViewHolder(view);
            Holders.add(v2);

            return  v2;
        case item_nature.END_TYPE:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.end_layout, parent, false);

            ENDIFViewHolder v3 = new ENDIFViewHolder(view);

            Holders.add(v3);
            return  v3;
        case item_nature.CALENDAR:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.calendar_layout, parent, false);


            CALENDARViewHolder v4 = new CALENDARViewHolder(view);
            Holders.add(v4);
            return  v4;
        case item_nature.LOCATION:
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.location_layout, parent, false);

            LOCATIONViewHolder v5 = new LOCATIONViewHolder(view);
            Holders.add(v5);
            return  v5;
    }
    return null;
}

1 Ответ

0 голосов
/ 16 апреля 2019

Не открывайте и не изменяйте представления Viewholder вне onBindViewHolder. Вместо этого вы можете использовать ассоциативные данные с представлением.

Подумайте, у вашего класса адаптеров есть глобальная переменная типа HashMap colorMap. Ключом HashMap будет индекс, а значением будет цвет.

Например, вы хотите изменить цвет второй строки на красный.

colorMap.put(2, Color.RED);
adapter.notifyItemChanged(2); // it can be notifyDataSetChanged(); for the other view need to be change.

Наконец, ваш метод notifyItemChanged или notifyDataSetChanged вызывает причину повторного просмотра.

@Override
public void onBindViewHolder(@NonNull ABCHolder abcHolder, int i) {
       if(colorMap.containsKey(abcHolder.getAdapterPosition())
          abcHolder.itemView.setBackgroundColor(a.get(abcHolder.getAdapterPosition()));

В отличие от этого подхода, ваша стратегия изменения представления будет возвращена при вызове onBindViewHolder.

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