Нажатие на элемент программно в RecyclerView
Я загружаю список категорий, и в зависимости от того, что выбрано, мне нужно показать продукты соответствующей категории в RecyclerView
, Поэтому, когда я впервые начинаю Fragment
Мне нужно смоделировать щелчок пользователя в категории по умолчанию - в этом случае это будет первый.
Как я могу это сделать?
7 ответов
Без вашего кода мы не знаем, как вы реализуете свой onClickListener.
Обычно вы реализуете и устанавливаете элемент onClickListener в viewHolder вашего RecyclerView.Adapter.
Например: ViewHolder.itemView.setOnClickListener(listener);
Таким образом, решение вы можете использовать recyclerView.findViewHolderForAdapterPosition(0).itemView.performClick()
PS: не использовать findViewHolderForLayoutPosition()
в соответствии с док
Вот обходной путь, чтобы выбрать 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);
Пуристы не одобряют использование метода
recyclerView.findViewHolderForAdapterPosition(pos).itemView.performClick();
как говорится в документах:
Вернуть ViewHolder для элемента в заданной позиции набора данных. В отличие от {@link #findViewHolderForLayoutPosition(int)} этот метод учитывает любые ожидающие изменения адаптера, которые могут еще не отразиться на макете. С другой стороны, если был вызван {@link Adapter#notifyDataSetChanged()}, но новый макет еще не рассчитан, этот метод вернет
null
поскольку новые позиции видов неизвестны, пока не будет рассчитан макет. именно по той причине, что задержка с потоком иногда полезна. Любой вызов notifyDataSetChanged () заставляет его возвращать нуль. Лучше использовать метод адаптера 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;
}
}
Если вы хотите щелкнуть конкретный вид внутри строки в позиции, используйте
recyclerView.findViewHolderForAdapterPosition(pos).itemView.findViewById(R.id.view_id).performClick();
Приведенный ниже код делает это за вас, а также позволяет избежать
NullPointerException
:
recyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
recyclerView.findViewHolderForAdapterPosition(mPosition).itemView.performClick();
recyclerView.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
});
Если кто-то хочет просто переместить фокус на определенный элемент списка, он может вызвать следующий метод после инициализации RECYCLER VIEW HAS:
recyclerView.findViewHolderForAdapterPosition(index).itemView.requestFocus()
Если View не был инициализирован; обычно это занимает некоторое время после того, как вы установите адаптер в режим переработчика, затем вы можете использовать метод postDelayed() обработчика для запуска вышеуказанного кода примерно через 1 секунду, чтобы дать время для правильной инициализации представления.
Если вы уже расширяете ListAdapter из androidx.recyclerview.widget.ListAdapter,
Вы можете просто переопределить:
override fun onCurrentListChanged(previousList: MutableList<DayMonth>, currentList: MutableList<DayMonth>) {
super.onCurrentListChanged(previousList, currentList)
this.presenter.onItemClickListener(currentList.size.minus(1))
/**
Last postion : size.minus(1)
First position : 0
*/
}
как будет выглядеть ваш докладчик :
interface Presenter {
fun onItemClickListener(position : Int)
}