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

Что эквивалентно listview.setSelection в случае просмотра Recycler

В случае ListView, если мы хотим сделать определенный элемент выбранным, мы используем метод setSelection. Как мы это делаем в случае RecyclerView?

4b9b3361

Ответ 1

Используйте RecyclerView LayoutManager для прокрутки элемента в позиции

recyclerView.getLayoutManager().scrollToPosition(position)

Ответ 2

Проверьте

scrollToPositionWithOffset(int position, int offset)
scrollToPositionWithOffset(5,0);

от LinearLayoutManager Прокрутите до указанной позиции адаптера с заданным смещением от разрешенного начала макета.

передать смещение как 0, если вы хотите, чтобы выбор был сверху

Это сработало для меня

Ответ 3

Проверка

recyclerView.scrollToPosition(cursor.getcount() - 1);

Ответ 4

ListView.setSelected() выполняет (по крайней мере) две вещи:

  • Он устанавливает элемент в списке для выбора (при удалении выделения из другого элемента - если таковой существует)
  • Он прокручивает список, чтобы элемент отображался на экране.

Для достижения 2. либо вызовите метод scrollToPosition() RecyclerView (как указано Loser), либо вызовите один из методов прокрутки объекта LayoutManager в зависимости от вашего желаемого поведения прокрутки.

Например, recyclerView.getLayoutManager(). smoothScrollToPosition()

Вы можете прокрутить минимум, чтобы выбранный элемент отображался на экране. Если это так, и вы используете LinearLayoutManager или GridLayoutManager, вы можете построить такую ​​логику прокрутки на основе findFirstCompletelyVisibleItemPosition() и findLastCompletelyVisibleItemPosition(), определенные в этих классах.

Достижение 1. более сложно. Вы можете использовать следующий рецепт:

Сначала определите цвет фона в colors.xml, item_state_selected_color, который будет использоваться, когда выбран элемент. В вашей реализации onCreateViewHolder() создайте StateListDrawalbe и установите его как фон представления. Скажите примерно так:

public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {

    // inflate the item view
    View itemView =  LayoutInflater.from(viewGroup.getContext()).
                           inflate(itemResourceId,viewGroup, false);

    // create color drawable by a resorce id
    ColorDrawable colorDrawableSelected =
       new ColorDrawable(resources.getColor(R.color.item_state_selected_color)); 

   // create StateListDrawable object and define its states
   StateListDrawable stateListDrawable = new StateListDrawable();
   stateListDrawable.addState(new int[]{android.R.attr.state_selected}, colorDrawableSelected);
   stateListDrawable.addState(StateSet.WILD_CARD, null);

   // set the StateListDrawable as background of the item view
   if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) {
      itemView.setBackgroundDrawable(stateListDrawable); 
   }
   else {
      itemView.itemView.setBackground(stateListDrawable);
   }

   // create view holder object providing it with the item view
   return new YourViewHolder(itemView);   
}

В объекте YourAdapter (или в другом месте) сохраните переменную mCurrentSelectedPosition (возможно, инициализированную до -1), которая удерживает текущую выбранную позицию. Все еще в адаптере, определите обработчик для кликов по элементам просмотра ресайклеров, в зависимости от вашей логики щелчка. Например:

void onItemClick(int position) {

   YourViewHolder yourViewHolder;

   int oldSelectedPosition = mCurrentSelectedPosition;

   if (position != mCurrentSelectedPosition) {
      mCurrentSelectedPosition = position;

      if (oldSelectedPosition != -1) {
         yourViewHolder = findViewHolderForPosition(oldSelectedPosition); 
         yourViewHolder.itemView.setSelected(false);     
      } 

      yourViewHolder = findViewHolderForPosition(mCurrentSelectedPosition);
      yourViewHolder.itemView.setSelected(true);
   }        
}

Затем в конструкторе YourViewHolder задайте прослушиватель кликов по элементу:

public YourViewHolder(View itemView,YourAdapter adapter) { 
  mAdapter = adapter;

  // ... other code here ...

  itemView.setOnClickListener(this);
}

Все еще в YourViewHolder переопределяет метод onClick() для делегирования обработки адаптеру. как это

@Override
public void onClick(View v) {
   mAdapter.onItemClick(getPosition());
}

Теперь есть только последняя проблема для решения - нам нужно отслеживать выбранный элемент в отношении утилизации.

@Override
public void onBindViewHolder(YourViewHolder yourViewHolder, int position) {

  if (position == mCurrentSelectedPosition) {
     yourViewHolder.itemView.setSelected(true);
  }
  else { 
     yourViewHolder.itemView.setSelected(false);
  }     

  // ... other code here ...  
}

Удачи!