Подтвердить что ты не робот

Щелчок по элементу программно в RecyclerView

Я загружаю список категорий и в зависимости от выбранного, мне нужно показать продукты соответствующей категории в RecyclerView. Поэтому, когда я впервые запускаю Fragment, мне нужно имитировать щелчок пользователя по умолчанию по умолчанию - в этом случае он будет первым.

Как это сделать?

Большое спасибо заранее.

4b9b3361

Ответ 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;

     }
  }