当前位置: 首页 > 面试题库 >

ListView-getView被调用太多次

令狐跃
2023-03-14
问题内容

我知道关于“多次调用getView”的问题很少,但是我的问题没什么不同。

我有一个带有自定义行的自定义listView(使用row_layout.xml)。通常效果很好。最初,我多次调用getView时遇到问题,并使用在stackoverflow中看到的一种方法解决了该问题。(使用’usedPositions’数组)。

现在,我在日志中看到这种情况:getView pos 0,getView pos 1,getView pos 0和getView
pos1。这使我的行加倍。仅当我调用一个涵盖当前活动的新活动然后关闭该活动时,它才会发生。(例如,打开相机活动,然后将其关闭)。

我将显示我的代码:

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

你能告诉我怎么了吗?


问题答案:

引用android工程师RomainGuy

这不是问题,绝对不能保证getView()的调用顺序和调用次数。

因此,您可以处理的最好办法是正确地重新使用现有视图(行布局)。

这是另一个好帖子。



 类似资料:
  • 问题内容: 我有一个自定义列表适配器: 在重写的“ getView”方法中,我执行打印以检查位置是什么,以及它是否是convertView: 其输出(第一次显示列表时,尚无用户输入) AFAIK,尽管我找不到明确说明的内容,但getView()仅用于可见行。由于我的应用以四个可见行开头,因此至少位置编号从0-3循环是有意义的。但是剩下的就是一团糟: 为什么每次对getview调用三次? 当我还没有

  • 本文向大家介绍Android ListView与getView调用卡顿问题解决办法,包括了Android ListView与getView调用卡顿问题解决办法的使用技巧和注意事项,需要的朋友参考一下 Android ListView与getView调用卡顿问题解决办法 解决办法1,设置ListView高度为固定值或者match_parent/ifll_parent 究其原因,无非是listview

  • 问题内容: 我有一个自定义列表适配器: 在重写的“ getView”方法中,我执行打印以检查位置是什么,以及它是否是convertView: 其输出(第一次显示列表时,尚无用户输入) AFAIK,尽管我找不到明确说明的内容,但getView()仅用于可见行。由于我的应用以四个可见行开头,因此至少位置编号从0-3循环是有意义的。但是剩下的就是一团糟: 为什么每次对getview调用三遍? 当我还没有

  • 问题内容: 我有一个自定义适配器,可显示订单列表中的每一行。 从Web服务查询新的订单列表之后,我想更新ListView的内容,因此我让Activity在调用notifyDataSetChanged()之前进行更新。 但是,从不调用OrderRowAdapter的getView()方法。ListView永远不会更新。 问题答案: 原来我不被叫的问题是因为它不可见。我的布局XML已经上与它的高度。因

  • 我试图为BillingClient v.2.2.0和Kotlin协同程序编写一个包装: 正如您所见,当我试图查询购买或购买时,我确保客户已经准备好。但在生产中存在许多错误: 我试图了解问题的原因,得到了if将被多次调用。可能存在异常。我一直想知道这是怎么可能的,因为我每次调用都会创建新的侦听器?我无法在emulator或测试设备上重现此问题。有人能解释一下这里发生了什么,以及如何解决吗?

  • 编辑: 链接到repo示例:https://gitlab.com/bartekwichowski/spock-too-many