ListView - getViewがあまりにも多く呼び出されました

私は、この問題については「何度も呼ばれるgetView」に関する質問はほとんどないことを知っていますが、私の問題は少し異なります。

カスタムrow(row_layout.xmlを使用)でカスタムlistViewを持っています。 それは一般的にうまくいく。最初はgetViewへの複数の呼び出しに問題があり、ここでstackoverflowで見た方法の1つを使用して修正されました。 ( '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;
}

何が間違っているのか教えていただけますか?

9

1 答え

Quoting android engineer RomainGuy

これは問題ではありません。注文の保証はまったくありません。   getView()は何回呼び出されるか何度実行されますか?

したがって、あなたが扱うことのできる最高のものは、既存のビューを再利用(行レイアウト)することです。

Here is another good post.

10
追加された
第2のリンクを参照してください。
追加された 著者 Adil Soomro,
リストビューでstackoverflowエラーが発生し、@LalitPoptaniによると、メソッドへの再帰呼び出しによってこの例外が生成されます。私はAndroid 2.3を使用しています。あなたの意見を共有してください。
追加された 著者 MKJParekh,
それを再利用する方法を提案できますか?
追加された 著者 Eran Tal,