Изменить фон элемента RecyclerView в определенной позиции

У меня есть RecyclerView и щелкнув по этому пункту, вы переходите к Activity, E сть ViewPager с несколькими предметами. При нажатии назад я сохраняю текущую позицию элемента. То, что я хочу сделать, это когда пользователь нажимает назад, стоя на любой элемент в ViewPagerэтот пункт должен быть выделен в RecyclerView,

ПРОБЛЕМА

Когда позиция элемента видна, проблем нет. Я меняю фон, используя следующие

view = layoutManager.findViewByPosition(Utils.ayat);
if(view != null) {
    LinearLayout parent = (LinearLayout) view.findViewById(R.id.parent);
    parent.setBackgroundColor(Color.GRAY);
}

Но если предмет не виден, ничего не происходит, и я не могу изменить фон.

То, что я сделал так далеко

  1. Попытка прокрутить до позиции, а затем изменить фон. RecyclerView прокручивает правильно, но findViewByPosition возвращает ноль.
  2. Я полагаю из моих наблюдений (может быть, это неправильно), что при программной прокрутке RecyclerViewпозиция, до которой он был прокручен, будет последним видимым элементом. Я пытался сделать это, но безуспешно.
  3. Как полагают многие, положить Thread.sleep(100) а затем попытался получить положение. Это тоже не сработало.

ПРИМЕЧАНИЕ: я не могу сделать это onBindViewHolder потому что элементы, которые будут выделены, не определены заранее.

3 ответа

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

Это обычно, как вы всегда должны делать с RecyclerView,

Ты пытался notifyItemChanged(int position)? Вы можете отправить выделенную позицию элемента в адаптер с помощью метода и вызова notifyItemChanged(int position), Например,

int highlightPosition = -1;

    public updateHighlightPosition(int position){
      highlightPosition = position;
      notifyItemChanged(position)
    }

    @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
      if(position == highlightPosition ){
         // You can change the background here
      }else{
        // Set default background
      }
  }

Попробуйте использовать класс RecyclerView.AdapterDataObserver, вызвав метод notifyItemChanged(position);

Всякий раз, когда вы вызываете метод notifyItemChanged() с определенной позицией, он вызывает класс AdapterDataObserver. Итак, сначала вам нужно вставить мой код, который я дал ниже, в ваш класс адаптера. проверь мой пример, у тебя появится идея для достижения твоего требования.

RecyclerView.AdapterDataObserver adapterDataObserver = new RecyclerView.AdapterDataObserver() {
    @Override
    public void onItemRangeChanged(int positionStart, int itemCount) {
        super.onItemRangeChanged(positionStart, itemCount);
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
                manager.scrollToPositionWithOffset(positionStart, 0);
                RecyclerView.ViewHolder rebindViewHolder = recyclerView.findViewHolderForLayoutPosition(positionStart);
                if (rebindViewHolder != null) {
                    onBindViewHolder((ViewHolder) rebindViewHolder, positionStart);
                }
            }
        }, 1000);
    }
};

после этого в методе onBindViewHolder измените фон с помощью позиции. Я думаю, что это поможет вам.

Другие вопросы по тегам