ListView - getView 被调用太多次

Posted

技术标签:

【中文标题】ListView - getView 被调用太多次【英文标题】:ListView - getView is called too much times 【发布时间】:2012-02-27 18:36:15 【问题描述】:

我知道关于“getView 调用几次”这个问题的问题很少,但我的问题略有不同。

我有一个带有自定义行的自定义 listView(使用 row_layout.xml)。 它通常运作良好。一开始我遇到了多次调用 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;

你能告诉我有什么问题吗?

【问题讨论】:

custom listview adapter getView method being called multiple times, and in no coherent order的可能重复 【参考方案1】:

Quoting安卓工程师RomainGuy

这不是问题,绝对不能保证在 哪个 getView() 将被调用或调用多少次。

所以你能处理的最好的就是re-using the existing views(行布局)。

Here is another 好帖子。

【讨论】:

你能建议如何重用它吗? 我在 listview 中遇到 *** 错误,并且根据 @LalitPoptani 对方法的递归调用会生成此异常。我使用的是安卓 2.3。请分享您的观点。

以上是关于ListView - getView 被调用太多次的主要内容,如果未能解决你的问题,请参考以下文章

Listview 没有被填充,getView() 没有被调用

ListView 的 getView() 方法啥时候调用?

Android LIstView初次创建getview方法执行多次问题

多次调用getView方法

自定义列表视图适配器 getView 方法被多次调用,并且顺序不一致

在 notifyDataSetChanged 上未调用 GetView,ListView 卡住