J'essaye de changer la couleur d'arrière-plan dans des éléments spécifiques dans un RecycleView. Comme je dois également définir du texte, j'ai le code suivant qui fonctionne bien:
if (linearLayoutManager.findFirstVisibleItemPosition() > 0) { viewHolder.itemView.setBackgroundResource(R.drawable.blackframe); } else{ viewHolder.itemView.setBackgroundResource(R.drawable.goldframe); }
Cela fonctionne comme je veux et realRank
prend les valeurs correctes, et le viewHolder.ranknumber.setText ("#" + String.valueOf (realRank));
Définit le bon texte sans problème.
Maintenant, j'essaye (comme j'ai obtenu un résultat numérique / texte correct, pour faire une instruction if comme celle-ci:
position =adapter.getItemViewType( 0); if(position == 0){ viewHolder.itemView.setBackgroundColor(Color.GREEN); }
(j'ai essayé avec String.valueOf (realRank) code > égalité, avec égalité
realRank
aussi)
Dans tous les cas, j'ai le même résultat. La couleur change comme il se doit aux positions 1, 2, 3 MAIS elle change aux positions 7, 8, 9 et 14, 15, 16 et 21, 22, 23 etc.
Que me manque-t-il ici?
if(position == 0){ viewHolder.itemView.setBackgroundColor(Color.GREEN); } else if(position == 1){ viewHolder.itemView.setBackgroundColor(Color.YELLOW); } else if(position == 2){ viewHolder.itemView.setBackgroundColor(Color.BLUE); } else{ viewHolder.itemView.setBackgroundColor(Color.WHITE); }
L'adaptateur:
adapter = new FirebaseRecyclerAdapter<Ranking, RankingViewHolder>( Ranking.class, R.layout.layout_ranking, RankingViewHolder.class, rankingTbl.orderByChild("score").limitToFirst(100) )
Cette ligne de code int realRank = totalRanking - viewHolder.getAdapterPosition () ;
donne un nombre (1,2,3,4,5,6 etc.) Pourquoi je ne peux pas utiliser ce nombre pour vérifier l'égalité?
Avis
Conserver ce code pour une solution qui ne fonctionne PAS, juste pour référence future:
public class RankingViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private ItemClickListener itemClickListener; public TextView txt_name, txt_score, txt_class, ranknumber; public ImageView personPhoto; public RankingViewHolder(View itemView) { super(itemView); txt_name = itemView.findViewById(R.id.txt_name); txt_score = itemView.findViewById(R.id.txt_score); personPhoto = itemView.findViewById(R.id.person_photo); txt_class = itemView.findViewById(R.id.txt_class); ranknumber = itemView.findViewById(R.id.ranknumber); itemView.setOnClickListener(this); } public void setItemClickListener(ItemClickListener itemClickListener) { this.itemClickListener = itemClickListener; } @Override public void onClick(View view) { itemClickListener.onClick(view , getAdapterPosition(),false); } }
Cela change la couleur MAIS pas pour seulement 3 premiers éléments. Au fur et à mesure que vous faites défiler vers le bas, change la couleur pour tous les 3 premiers éléments visibles comme avant, c'est-à-dire 1, 2, 3, 7, 8, 9, etc.
Mise à jour: p>
Je n'utilise pas d'adaptateur personnalisé, j'utilise FirebaseRecyclerAdapter
.
Merci au commentaire @Muhammad Haroon, j'ai vérifié que getItemViewType. Alors maintenant, j'essaye avec comme
if(adapter.getItemCount() -viewHolder.getAdapterPosition() == 0) { viewHolder.itemView.setBackgroundColor(Color.GREEN); } if(adapter.getItemCount() -viewHolder.getAdapterPosition() == 1) { viewHolder.itemView.setBackgroundColor(Color.YELLOW); } if(adapter.getItemCount() -viewHolder.getAdapterPosition() == 2) { viewHolder.itemView.setBackgroundColor(Color.BLUE); }
Ne fonctionne pas pour l'instant, mais je pense que c'est la bonne direction ...
Mise à jour 2
Avec la position, ce n'est pas possible car RecycleView recycle les vues donc j'ai le même résultat. Le code de travail est
protected void populateViewHolder(RankingViewHolder viewHolder, final Ranking model, int position) { final Context mContext = getActivity().getApplicationContext(); viewHolder.txt_name.setText(model.getUserName()); viewHolder.txt_score.setText(String.valueOf(model.getScore())); viewHolder.txt_class.setText(model.getUser_class()); Picasso.with(mContext).load(model.getAvatarUrl()).error(R.drawable.ic_people_black_24dp).into(viewHolder.personPhoto); int totalRanking = adapter.getItemCount(); int realRank = totalRanking - viewHolder.getAdapterPosition(); viewHolder.ranknumber.setText("# "+String.valueOf(realRank)); }
Fonctionne bien sauf qu'après le défilement, on perd le changement d'arrière-plan.
Donc, comme nous voulons et avons besoin de la perfection, toute idée pour garder même après le défilement?
3 Réponses :
Bonjour, essayez d'ajouter ceci dans votre Adapater, cela pourrait résoudre votre problème.
@Override public int getItemViewType(int position) { return position; }
Merci pour l'aide. Il lance android.content.res.Resources $ NotFoundException: ID de ressource # 0x1a. Essayer de le comprendre.
Veuillez essayer de remplacer
dans votre adaptateur personnalisé
myAdapter.setHasStableIds(true);
et dans votre objet adaptateur:
@Override public long getItemId(int position) { return position; }
Je n'utilise pas d'adaptateur personnalisé. Comme vous pouvez le voir dans le code de l'adaptateur, j'utilise FirebaseRecycleAdapter qui est presque le même avec RecycleAdapter. il a déjà getItemId, getViewType. Mais je ne sais pas comment l'utiliser pour obtenir UNIQUEMENT le premier article.
Dans populateViewHolder
ajoutez cette ligne de code
if(position == 0){ viewHolder.itemView.setBackgroundColor(Color.GREEN); } else if(position == 1){ viewHolder.itemView.setBackgroundColor(Color.YELLOW); } else if(position == 2){ viewHolder.itemView.setBackgroundColor(Color.BLUE); } else{ viewHolder.itemView.setBackgroundColor(Color.WHITE); }
la position est un paramètre dans populateViewHolder
.
Comme je l'ai dit, cela ne fonctionne pas. Modifie les valeurs en N'IMPORTE QUEL élément visible qui a la position 1, 2, 3 au moment où vous faites défiler. C'est une liste de classement et je veux SEULEMENT le premier élément "mis en évidence. Je l'ai géré si vous vérifiez la dernière mise à jour avec findFirstVisibleItemPosition (). Le seul problème est qu'il perd le changement lorsque vous faites défiler vers l'arrière. Essayer de trouver une solution pour cela.
vérifiez mon avis. Comme je l'ai dit, tout ce qui a à voir avec la position change de couleur pour TOUS les 3 éléments visibles. Je dois changer SEULEMENT les 3 PREMIERS éléments. La seule solution de travail est donc findFirstVisibleItemPosition () et effectuez les comptages. Sauf faire défiler vers l'arrière que je travaille actuellement.
ajoutez cette méthode de substitution getItemViewType et vérifiez si elle fonctionne
@JinsLukose l'ajouter dans la visionneuse? pouvez-vous être pls plus spécifiques
oui à l'intérieur de votre classe d'adaptateur. c'est une fonction remplacée
@JinsLukose Je n'utilise pas d'adaptateur personnalisé. Le code est le RankingViewHolder et l'adaptateur = new FirebaseRecyclerAdapter (Ranking.class, R.layout.layout_ranking, RankingViewHolder.class, rankingTbl.orderByChild ("score"). LimitToFirst (100)