1
votes

Comment changer la couleur d'arrière-plan pour des éléments de vue spécifiques dans un RecycleView?

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?


4 commentaires

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)


3 Réponses :


2
votes

Bonjour, essayez d'ajouter ceci dans votre Adapater, cela pourrait résoudre votre problème.

@Override
    public int getItemViewType(int position) {
        return position;
    }


1 commentaires

Merci pour l'aide. Il lance android.content.res.Resources $ NotFoundException: ID de ressource # 0x1a. Essayer de le comprendre.



0
votes

Veuillez essayer de remplacer

dans votre adaptateur personnalisé

myAdapter.setHasStableIds(true);

et dans votre objet adaptateur:

@Override
public long getItemId(int position) {
    return position;
}


1 commentaires

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.



0
votes

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.


2 commentaires

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.