2012-02-06 43 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