web-dev-qa-db-fra.com

Quel est le listview.setSelection équivalent en cas de Recycler View

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?

32
user3008777

Utilisez RecyclerViewLayoutManager pour faire défiler l'élément à la position

recyclerView.getLayoutManager().scrollToPosition(position)

24
Libin

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

17
Pramod

Vérifier

recyclerView.scrollToPosition(cursor.getcount() - 1);
7
Reaz Murshed

ListView.setSelected () fait (au moins) deux choses:

  1. Il définit l'élément dans la liste à sélectionner (tout en supprimant la sélection d'un autre élément - si tel est le cas)
  2. Il fait défiler la liste pour que l'élément soit visible à l'écran.

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!

2
HaimS