Dans le cas d'un ListView
si nous voulons sélectionner un élément particulier, nous utilisons la méthode setSelection
. Comment procéder en cas de RecyclerView
?
Utilisez RecyclerView
LayoutManager
pour faire défiler l'élément à la position
recyclerView.getLayoutManager().scrollToPosition(position)
Vérifier
scrollToPositionWithOffset(int position, int offset)
scrollToPositionWithOffset(5,0);
à partir de LinearLayoutManager Faites défiler jusqu'à la position d'adaptateur spécifiée avec le décalage donné par rapport au début de la mise en page résolue.
passer l'offset à 0 si vous voulez une sélection en haut
Cela a fonctionné pour moi
Vérifier
recyclerView.scrollToPosition(cursor.getcount() - 1);
ListView.setSelected () fait (au moins) deux choses:
Pour y parvenir, 2. appelez la méthode scrollToPosition () de RecyclerView (comme indiqué par Loser) ou appelez l'une des méthodes de défilement de l'objet LayoutManager en fonction du comportement de défilement souhaité.
Par exemple, recyclerView.getLayoutManager (). SmoothScrollToPosition ()
Vous souhaiterez peut-être faire défiler le minimum pour que l'élément sélectionné s'affiche à l'écran. Si tel est le cas et que vous utilisez LinearLayoutManager ou GridLayoutManager, vous pouvez créer une telle logique de défilement basée sur findFirstCompletelyVisibleItemPosition () et findLastCompletelyVisibleItemPosition () définies dans ces classes.
Atteindre 1. est plus délicat. Vous pouvez utiliser la recette suivante:
Définissez d'abord une couleur d'arrière-plan dans colors.xml, item_state_selected_color, à utiliser lorsqu'un élément est sélectionné. Dans votre implémentation onCreateViewHolder (), créez un StateListDrawalbe et définissez-le comme arrière-plan de la vue. Dites quelque chose comme ceci:
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);
}
Dans votre objet YourAdapter (ou ailleurs), enregistrez une variable, mCurrentSelectedPosition (probablement initialisée à -1) qui contient la position actuellement sélectionnée. Toujours dans l'adaptateur, définissez un gestionnaire de clics sur les éléments de la vue du recycleur, en fonction de votre logique de clic. Par exemple:
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);
}
}
Ensuite, dans le constructeur de YourViewHolder, définissez l'écouteur sur les clics sur l'élément:
public YourViewHolder(View itemView,YourAdapter adapter) {
mAdapter = adapter;
// ... other code here ...
itemView.setOnClickListener(this);
}
Toujours dans YourViewHolder, remplacez la méthode onClick () pour déléguer la gestion à l'adaptateur. comme ça
@Override
public void onClick(View v) {
mAdapter.onItemClick(getPosition());
}
Maintenant, il n'y a que le dernier problème à résoudre - nous devons garder une trace de l'élément sélectionné en ce qui concerne le recyclage.
@Override
public void onBindViewHolder(YourViewHolder yourViewHolder, int position) {
if (position == mCurrentSelectedPosition) {
yourViewHolder.itemView.setSelected(true);
}
else {
yourViewHolder.itemView.setSelected(false);
}
// ... other code here ...
}
Bonne chance!