2012-02-06 13 views
9

So che ci sono alcune domande riguardanti questo problema di "getView chiamato poche volte" ma il mio problema è leggermente diverso.ListView - getView è chiamato troppe volte

Ho un listView personalizzato con riga personalizzata (utilizzato row_layout.xml). In genere funziona bene. All'inizio ho avuto un problema con più chiamate a getView ed è stato risolto utilizzando uno dei metodi che ho visto qui in StackOverflow. (usando la matrice 'usedPositions').

ora, vedo nei registri questo scenario: getView pos 0, getView pos 1, getView pos 0, getView pos 1. Ciò ha causato il raddoppiamento delle mie righe. Succede solo quando chiamo una nuova attività che copre l'attività corrente e poi chiudo quell'attività. (ad esempio, aprire l'attività della telecamera e quindi chiuderla).

vi mostrerò il mio codice:

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; 
} 

Potete dirmi cosa c'è di sbagliato?

+0

Possibile duplicato di [metodo listView dell'adapter personalizzato chiamato più volte e in un ordine non coerente] (http://stackoverflow.com/questions/2618272/custom-listview-adapter-getview-method-being-called- multiple-times-and-in-no-co) – engincancan

risposta

10

Quoting ingegnere Android RomainGuy

Questo non è un problema, non c'è assolutamente alcuna garanzia sull'ordine in cui GetView sarà chiamato(), né quante volte.

Quindi il meglio che è possibile gestire è re-using the existing views (layout di riga) correttamente.

Here is another buon post.

+0

puoi suggerire come riutilizzarlo? –

+0

vedere il [secondo link] (http://android.amberfog.com/?p=296) .. –

+0

Ottengo errore stackoverflow in listview e in base alla chiamata ricorsiva @LalitPoptani a un metodo genera questa eccezione. Sto usando Android 2.3. Per favore condividi le tue opinioni. – MKJParekh

Problemi correlati