Mettez en surbrillance l'élément sélectionné dans un RecyclerView
Je vais avoir des ennuis avec en surbrillance un élément au sein d'un RecyclerView, similaire à la création de l'élément sélectionné dans une liste.
Pour le moment, j'ai mis en place le RecyclerView, ont une valeur par défaut LayoutManager, et avoir une carte qui affiche toutes les données. J'ai tout récemment eu la onClickListener()
de travail (bien que je ne suis pas sûr si elle doit aller dans le onCreateViewHolder()
ou onBindViewHolder*(
- vous ne savez pas quand onBindViewHolder()
est appelé).
J'ai essayé de chercher autour, et le plus proche que j'ai reçu est le la question ici. Cependant, je suis complètement perdu dans cette question. Où est ce que onClick()
méthode (à l'intérieur de la carte, à l'intérieur du contenant de l'Activité/fragment, etc?). Qu'est ce que viewHolderListener
? Qu'est-ce que getPosition()
de et pour quoi faire exactement? Essentiellement, j'ai eu nulle part à partir de cette question, et c'était la meilleure ressource que j'ai pu trouver jusqu'à présent.
Voici mon code actuel pour la mise en place de la RecyclerView:
//Sets up the main navigation
private void setupMainNav() {
//use this setting to improve performance if you know that changes
//in content do not change the layout size of the RecyclerView
mMainRecyclerNav.setHasFixedSize(true);
//use a linear layout manager
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
mMainRecyclerNav.setLayoutManager(layoutManager);
//Create and set the adapter for this recyclerView
MainNavAdapter adapter = new MainNavAdapter(getActivity());
mMainRecyclerNav.setAdapter(adapter);
}
Voici mon code actuel de la carte:
class MainNavAdapter extends RecyclerView.Adapter<MainNavAdapter.ViewHolder> {
Context mContext;
//Holds the titles of every row
String[] rowTitles;
//Default constructor
MainNavAdapter(Context context) {
this.mContext = context;
//Get the rowTitles - the necessary data for now - from resources
rowTitles = context.getResources().getStringArray(R.array.nav_items);
}
//Simple class that holds all the views that need to be reused
class ViewHolder extends RecyclerView.ViewHolder{
View parentView; //The view which holds all the other views
TextView rowTitle; //The title of this item
//Default constructor, itemView holds all the views that need to be saved
public ViewHolder(View itemView) {
super(itemView);
//Save the entire itemView, for setting listeners and usch later
this.parentView = itemView;
//Save the TextView- all that's supported at the moment
this.rowTitle = (TextView) itemView.findViewById(R.id.row_title);
}
}
//Create new views (invoked by the layout manager)
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
//Create the view for this row
View row = LayoutInflater.from(mContext)
.inflate(R.layout.list_navmain_row, viewGroup, false);
//Create a new viewHolder which caches all the views that needs to be saved
ViewHolder viewHolder = new ViewHolder(row);
return viewHolder;
}
//Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
//- get element from your dataset at this position
//- replace the contents of the view with that element
viewHolder.rowTitle.setText(rowTitles[i]);
//TODO: Make a better workaround for passing in the position to the listener
final int position = i;
//Set a listener for this entire view
viewHolder.parentView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getActivity(), "Clicked on row: " + position, Toast.LENGTH_SHORT).show();
}
});
}
//Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return rowTitles.length;
}
}
Je vous serais reconnaissant de toute aide. Merci.
source d'informationauteur MDragon00
Vous devez vous connecter pour publier un commentaire.
RecyclerView
ne gère pas la sélection de l'élément ou des états comme unListView
. Au lieu de cela, vous avez à gérer cela manuellement dans votre vue titulaire.La première chose que vous pouvez faire est de déclarer votre point de vue comme cliquable, dans votre " ViewHolder constructeur :
Alors si vous voulez mettre en surbrillance la sélection, vous devez garder une trace des lignes sélectionnées dans votre carte (par exemple à l'aide d'une Liste d'indices), et dans votre onBindViewHolder méthode :
Comme une note de côté, vous devez régler le onClickListener sur votre vue parent dans le onCreateViewHolder au lieu de la onBindViewHolder. Le onBindViewHolder méthode sera appelée plusieurs fois pour le même point de vue, titulaire, et vous serez d'effectuer plus d'opérations que nécessaire
Je suis l'extension @XGouchet de réponse parce que même si elle m'a mis sur le droit chemin, j'ai encore besoin de faire du travail supplémentaire à la charge de la sélection ET DÉSÉLECTIONNER les lignes (comme un interrupteur). @ScottBiggs et j'avais besoin de ce type de soutien.
Le code tient sur
mSelectedPosition
qui permet la sélection doit être correctement définie dansonBindViewHolder
etmSelectedView
qui permet la sélection pour être positionnés correctement (à la fois sur et en dehors) lorsque l'utilisateur clique dessus.Il y a un moyen facile de le faire:
D'essayer cette solution si vous souhaitez mettre en surbrillance l'élément sélectionné pour un moment seulement après cliquez sur. J'utilise retrolambda mais vous pouvez faire un usage normal, l'objet Praticable.
1.
créer list_item_selector.xml dans votre Drawable répertoire
Ensemble de votre sélection dans la racine de la mise en page de votre article unique