В случае ListView
, если мы хотим сделать определенный элемент выбранным, мы используем метод setSelection
. Как мы это делаем в случае RecyclerView
?
Что эквивалентно listview.setSelection в случае просмотра Recycler
Ответ 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 ...
}
Удачи!