2012-02-06 67 views
9

我知道有關於「getView叫幾聲」這個問題上幾個問題,但我的問題是有點不同。的ListView - getView被稱爲太多時間

我有一個自定義行(使用row_layout.xml)的自定義的ListView。 它通常運作良好。在開始時,我遇到了多次調用getView的問題,並且通過使用我在此處看到的一種方法修復了此問題。 (使用'usedPositions'數組)。

現在,我在日誌中看到這種情況:getView pos 0,getView pos 1,getView pos 0,getView pos 1. 這使我的行數加倍。只有當我調用覆蓋當前活動的新活動並關閉該活動時纔會發生。 (例如,打開相機活動並關閉它)。

我會告訴我的代碼:

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

你能告訴我有什麼不對?

+0

的可能的複製[自定義列表視圖適配器getView方法被調用多次,並且在沒有連貫順序](http://stackoverflow.com/questions/2618272/custom-listview-adapter-getview-method-being-called-多時間,和在-NO-CO) – engincancan 2017-03-31 09:12:00

回答

10

Quoting的Android工程師RomainGuy

這不是一個問題,有訂單就完全沒有保證在 其中getView()將會被調用,也沒有多少倍。

所以你可以處理的最好是re-using the existing views(行佈局)。

Here is another好的職位。

+0

你可以建議如何重用呢? – 2012-02-06 08:57:30

+0

參見[第二連桿(http://android.amberfog.com/?p=296).. – 2012-02-06 09:02:32

+0

我在列表視圖得到計算器錯誤並根據@LalitPoptani遞歸調用一個方法生成此異常。我正在使用Android 2.3。請分享您的觀點。 – MKJParekh 2014-05-10 09:00:56

相關問題