Изменить фон элемента 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);
}
Но если предмет не виден, ничего не происходит, и я не могу изменить фон.
То, что я сделал так далеко
- Попытка прокрутить до позиции, а затем изменить фон.
RecyclerView
прокручивает правильно, ноfindViewByPosition
возвращает ноль. - Я полагаю из моих наблюдений (может быть, это неправильно), что при программной прокрутке
RecyclerView
позиция, до которой он был прокручен, будет последним видимым элементом. Я пытался сделать это, но безуспешно. - Как полагают многие, положить
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 измените фон с помощью позиции. Я думаю, что это поможет вам.