Щелчок по элементу программно в RecyclerView
Я загружаю список категорий и в зависимости от выбранного, мне нужно показать продукты соответствующей категории в RecyclerView
.
Поэтому, когда я впервые запускаю Fragment
, мне нужно имитировать щелчок пользователя по умолчанию по умолчанию - в этом случае он будет первым.
Как это сделать?
Большое спасибо заранее.
Ответы
Ответ 1
Без вашего кода мы не знаем, как вы реализуете свой onClickListener.
Обычно вы реализуете и устанавливаете элемент onClickListener в viewHolder вашего RecyclerView.Adapter.
Например: ViewHolder.itemView.setOnClickListener(listener);
Итак, вы можете использовать recyclerView.findViewHolderForAdapterPosition(0).itemView.performClick()
PS: Не используйте findViewHolderForLayoutPosition()
в соответствии с Doc
Ответ 2
Ниже приведено обходное решение для выбора 1-го ребенка recyclerview после настройки адаптера, надеюсь, что это поможет вам
//position to be clicked
final int pos = 0;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
recyclerView.findViewHolderForAdapterPosition(pos).itemView.performClick();
}
},1);
наслаждайтесь:)
Ответ 3
На пуристах он недоволен использованием метода
recyclerView.findViewHolderForAdapterPosition(pos).itemView.performClick();
как указано в документах:
Return the ViewHolder for the item in the given position of the data set. Unlike
* {@link #findViewHolderForLayoutPosition(int)} this method takes into account any pending
* adapter changes that may not be reflected to the layout yet. On the other hand, if
* {@link Adapter#notifyDataSetChanged()} has been called but the new layout has not been
* calculated yet, this method will return <code>null</code> since the new positions of views
* are unknown until the layout is calculated.
точно по той причине, что иногда задержка с потоком полезна. Любой вызов notifyDataSetChanged() заставляет его возвращать значение null. Лучше использовать метод адаптера onBindViewHolder и проверить позицию 0. Отрегулируйте, как вы настроили слушателя, обычный способ здесь, например, созданный в конструкторе ViewHolder. Используйте переменную init для предотвращения повторного вызова:
@Override
public void onBindViewHolder(FooAdapter.ViewHolder viewHolder, int position) {
//code
...
//do this last especially if you are using an animator
if(position == 0 && isInit) {
listener.onItemClick( viewHolder.itemView,0);
isInit =false;
}
}