2012-02-06 2 views
9

Je sais qu'il y a quelques questions concernant ce problème de 'getView appelé quelques fois' mais mon problème est peu différent.ListView - getView est appelé trop de fois

J'ai un listView personnalisé avec une ligne personnalisée (utilisé un row_layout.xml). Cela fonctionne généralement bien. Au début, j'ai eu un problème avec plusieurs appels à getView et il a été corrigé en utilisant l'une des méthodes que j'ai vues ici dans stackoverflow. (en utilisant le tableau 'usedPositions').

maintenant, je vois dans les journaux ce scénario: getView pos 0, getView pos 1, getView pos 0, getView pos 1. Cela a entraîné le doublage de mes lignes. Cela n'arrive que lorsque j'appelle une nouvelle activité qui couvre l'activité en cours, puis ferme cette activité. (par exemple, ouvrez l'activité de la caméra puis fermez-la).

Je vais montrer mon code:

public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View row = convertView; 
    Toast toast = Toast.makeText(this.context, "getView " + position, 1000); 
    toast.show(); 
    String pos = Integer.toString(position); 
    if (!usedPositions.contains(pos)) { 

     CardHolder holder = null; 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new CardHolder(); 
      //holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); 
      holder.txtCouponTitle = (TextView)row.findViewById(R.id.txtTitle); 
      holder.txtBusinessName = (TextView)row.findViewById(R.id.txtBusinessName); 
      row.setTag(holder); 
     } 
     else 
     { 
      holder = (CardHolder)row.getTag(); 
     } 

     Card card = data.get(position); 
     holder.txtCouponTitle.setText(card.couponTitle); 
     holder.txtBusinessName.setText(card.businessName); 
     //holder.imgIcon.setImageResource(card.icon); 

     TableLayout table = (TableLayout)row.findViewById(R.id.imagesTable); 
     for (int r=1; r<=1; r++){ 
      TableRow tr = new TableRow(this.context); 
      for (int c=1; c<=10; c++){ 
       ImageView im = new ImageView (this.context); 
       im.setImageDrawable(this.context.getResources().getDrawable(c<= card.numberOfStamps ? R.drawable.stamp_red :R.drawable.stamp_grey)); 
       im.setPadding(6, 0, 0, 0); //padding in each image if needed 
       //add here on click event etc for each image... 
       //... 
       tr.addView(im, 40,40); 
      } 
      table.addView(tr); 
     } 

     // Your code to fill the imageView object content 
     usedPositions.add(pos); // holds the used position 
    } 
    else 
     usedPositions.remove(pos); 

    return row; 
} 

Pouvez-vous me dire ce qui ne va pas?

+0

Copie possible de [méthode getView personnalisée de l'adaptateur ListView appelée plusieurs fois, et dans aucun ordre cohérent] (http://stackoverflow.com/questions/2618272/custom-listview-adapter-getview-method-being-called- multi-times-and-in-no-co) – engincancan

Répondre

10

Quoting ingénieur android RomainGuy

Ce n'est pas un problème, il n'y a absolument aucune garantie sur l'ordre dans lequel getView() sera appelée, ni combien de fois.

Alors le mieux que vous pouvez gérer est re-using the existing views (disposition des lignes) correctement.

Here is another bon article.

+0

pouvez-vous suggérer comment le réutiliser? –

+0

voir le [deuxième lien] (http://android.amberfog.com/?p=296) .. –

+0

Je reçois erreur stackoverflow dans listview et selon l'appel récursif @LalitPoptani à une méthode génère cette exception. J'utilise Android 2.3. S'il vous plaît partagez votre point de vue. – MKJParekh

Questions connexes