Couleur de fond alternative pour la classe ListView même sans données

Je souhaite définir une couleur alternative pour ma classe ListView personnalisée.

Le code est donné ci-dessous:

  • Comment charger l'image à travers le tableau d'octets en utilisant Glide?
  • Migrer Android Studio 0.6.1 à 0.8: ne semble pas être un dossier de configuration Android Studio ou une installation à la maison
  • Obtenir "" l'erreur d'icône: l'icône: l'attribut n'est pas une valeur de chaîne "lors de la transmission d'un APK à la Play Store
  • Android: Utilisation du style par défaut dans un titre de boîte de dialogue personnalisé
  • ActionLayout pour les éléments navigationview s'affiche sur le côté droit
  • Pourquoi l'utilisation de méthodes d'aide statique dans Java est-elle mauvaise?
  •  import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.view.View; import android.widget.ListView; public class CustomListView extends ListView { private Paint mPaint = new Paint(); private Paint mPaintBackground = new Paint(); public CustomListView(Context context, AttributeSet attrs) { super(context, attrs); mPaint.setColor(Color.parseColor("#1A000000")); } @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); final int currentHeight = getMeasuredHeight(); final View lastChild = getChildAt(getChildCount() - 1); if (lastChild == null) return; for (int i = 0; i < getChildCount(); i++) { if (getChildCount() % 2 == 0) { mPaintBackground.setColor(Color.WHITE); } else { mPaintBackground.setColor(Color.RED); } } final int lastChildBottom = lastChild.getBottom(); final int lastChildHeight = lastChild.getMeasuredHeight(); final int nrOfLines = (currentHeight - lastChildBottom) / lastChildHeight; Rect r = new Rect(0, lastChildBottom, getMeasuredWidth(), getMeasuredHeight()); canvas.drawRect(r, mPaintBackground); canvas.drawLine(0, lastChildBottom, getMeasuredWidth(), lastChildBottom, mPaint); for (int i = 0; i < nrOfLines; i++) { canvas.drawLine(0, lastChildBottom + (i + 1) * lastChildHeight, getMeasuredWidth(), lastChildBottom + (i + 1) * lastChildHeight, mPaint); } return; } } 

    Pour obtenir une couleur de fond alternée pour ListView , j'ai utilisé ce code:

     for (int i = 0; i < getChildCount(); i++) { if (getChildCount() % 2 == 0) { mPaintBackground.setColor(Color.WHITE); } else { mPaintBackground.setColor(Color.RED); } } 

    À l'intérieur de l'adaptateur:

      if (position % 2 == 0) { view.setBackgroundColor(Color.RED); } else { view.setBackgroundColor(Color.WHITE); } 

    Mais il montre toujours une couleur, rouge ou blanc avec tout ce que j'essaie. Je ne reçois pas de couleurs alternées blanc-rouge-blanc-rouge.

  • React Native sur Android n'a pas pu trouver Build Tools
  • Android: comment changer la position de l'indicateur ExpandableListView?
  • "La méthode setListAdapter (ArrayAdapter) est indéfinie pour le type create"
  • Ajout de Google Search API à l'application Android
  • Android: comment enregistrer tous les appels de méthodes d'activité?
  • Android: comment obtenir une liste des activités installées, telles qu'elles apparaissent dans le lanceur, sans doublons
  • 4 Solutions collect form web for “Couleur de fond alternative pour la classe ListView même sans données”

    La raison pour laquelle cela échoue est que votre boucle for ne change jamais. Vous consultez toujours getChildCount() % 2 . getChildCount() renverra le même pour chaque itération. Vous devez effectuer votre chèque en fonction de la position:

     for(int i = 0; i < getChildCount(); i++){ if(i % 2 == 0){ mPaintBackground.setcolor(Color.WHITE); } else{ mPaintBackground.setColor(Color.RED); } } 

    Si cela vous aide, renommez votre variable de compteur de i à position afin que cela soit plus lisible pour vous à l'avenir, ou notez-le pour vous aider.

    J'aimerais également ajouter que, compte tenu du code que vous avez déjà, votre boucle for ne change rien. Il s'agit simplement d'itérer le nombre d'enfants et de définir mPaintBackground . À la fin, il sera laissé avec quelle que soit la valeur qu'il reçoit de la dernière itération.

    Je pense que la meilleure façon de gérer le dessin de la couleur d'arrière-plan serait dans l'adaptateur pour Listview, auquel cas vous pouvez remplacer getView () et effectuer une vérification en fonction du paramètre de position :

     int backgroundResource; if(position % 2 == 0){ backgroundResource = getResources.getColor(android.R.color.WHITE); } else{ backgorundResource = getResources.getColor(android.R.color.RED); } view.setBackground(backgroundResource); 

    Bien sûr, ce qui précède n'est qu'un pseudocode, il faudra peut-être l'adapter à votre projet.


    La solution ci-dessus ne fonctionnera que pour les données existantes. Si vous avez besoin d'une couleur alternative, qu'il s'agisse ou non de données, ce qui, si je comprends maintenant, est ce que vous essayez d'atteindre dans dispatchDraw . Je serai très sincère que je ne suis pas sûr de la façon de faire cela, et je ne peux pas le tester, mais j'imagine que les étapes se passent ainsi:

    • Obtenez la hauteur de ListView
    • Obtenez la largeur de ListView
    • Obtenez la taille d'un enfant (listPreferredItemHeight, si vous utilisez cela. Si vous utilisez le contenu de l'emballage, cela pourrait être plus difficile car vous ne pouvez pas prédire la taille des éléments, de sorte que les couleurs alternées pour un ListView vide seraient difficiles).
    • Bien qu'il reste de l'espace dans ListView, tracez un rectangle.

    Notez ici que vous ne pouvez pas iterate en fonction du nombre d'enfants, car vous pourriez ne pas en avoir sur ce point.

    Pseudocode:

     listViewWidth = getMeasuredWidth(); listViewHeight = getMeasuredHeight(); numChildren = getChildCount(); itemHeight = getItemHeight(); // See comments above, adjust this for your problem. currentTop = 0; // Used to keep track of the top of the rectangle we are drawing. currentBottom = itemHeight; // Used to keep track of the bottom rectangle we are currently drawing. int currentRectangle = 0; while(currentBottom <= listViewHeight){ if(currentRectangle % 2 == 0){ mPaintBackground.setColor(Color.WHITE); } else{ mPaintBackground.setColor(Color.RED); } Rect r = new Rect(0, currentBottom, getMeasuredWidth(), getMeasuredHeight()); canvas.drawRect(r, mPaintBackground); // Move to next currentTop += itemHeight; currentBottom += itemHeight; currentRectangle++; } 

    Enfin, j'ai eu ma réponse avec l'aide énorme de @ McAdam331. Après avoir utilisé son code, j'ai eu quelque chose de bizarre, mais après, j'ai réparé le code à l'aide de celui-ci.

      int listViewHeight = getMeasuredHeight(); int itemHeight = lastChild.getMeasuredHeight(); int currentTop = 0; int currentBottom = lastChild.getBottom(); int currentRectangle = 0; while (currentBottom <= listViewHeight) { if (currentRectangle % 2 == 0) { mPaintBackground.setColor(Color.WHITE); } else { mPaintBackground.setColor(Color.parseColor("#f7f7f7")); } Rect r = new Rect(0, currentBottom, getMeasuredWidth(), getMeasuredHeight()); canvas.drawRect(r, mPaintBackground); // Move to next currentTop += itemHeight; currentBottom += itemHeight; currentRectangle++; } 

    Il y a une petite erreur dans la logique. Voici le code mis à jour pour cette section:

     for (int i = 0; i < getChildCount(); i++) { if (i % 2 == 0) { view.setBackgroundColor(getResources.getColor(Color.WHITE)); } else { view.setBackgroundColor(getResources.getColor(Color.RED)); } } 

    Le contrôle doit être sur la variable de contrôle du compteur, getChildCount renverra toujours le nombre total d'éléments, c'est pourquoi vous voyez toujours la même couleur. Le code collé ci-dessus résoudra votre problème. Mais ce code devrait être dans getView () pour votre classe d'adaptateur, car la fonction getView () est appelée sur chaque ligne pour le rendu. Votre approche actuelle appellera la fonction une fois et vous n'obtiendrez pas le résultat souhaité.

    Vous pouvez créer le même effet pour un Listview en créant simplement un Adapter personnalisé:

     public class MyAlternateColorAdapter extends ArrayAdapter<SomeObject> { private Context context; //Get the Context from the constructor ... @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View rowView = inflater.inflate(R.layout.rowlayout, parent, false); if (position % 2 == 0) { rowView.setBackgroundColor(Color.RED); // Or use rowView.setBackgroundResource(R.drawable.bg_red); where bg_red is a drawable with a selector to provide touch feedback } else { rowView.setBackgroundColor(Color.WHITE); } // Set the data of the row ... } } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.