Нажатие на элемент программно в 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)
}
Другие вопросы по тегам