ListView - getView вызывается слишком много раз

Я знаю, что есть несколько вопросов по поводу «getView, вызываемого несколько раз», но моя проблема немного отличается.

У меня есть собственный списокView с пользовательской строкой (используется row_layout.xml). Обычно это работает хорошо. В начале у меня была проблема с несколькими вызовами getView, и она была исправлена ​​с помощью одного из методов, которые я видел здесь в stackoverflow. (с использованием массива 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;
}

Можете ли вы сказать мне, что случилось?


person Eran Tal    schedule 06.02.2012    source источник
comment
Возможный дубликат пользовательского адаптера просмотра списка Метод getView вызывается несколько раз и в произвольном порядке   -  person engincancan    schedule 31.03.2017


Ответы (1)


Цитирование Android-инженер RomainGuy

Это не проблема, нет абсолютно никакой гарантии ни в том порядке, в котором будет вызываться getView(), ни в том, сколько раз.

Таким образом, лучшее, что вы можете сделать, это правильно повторно использовать существующие представления (макеты строк).

Вот еще один хороший пост.

person Adil Soomro    schedule 06.02.2012
comment
можете подсказать как его использовать? - person Eran Tal; 06.02.2012
comment
Я получаю ошибку stackoverflow в списке, и, согласно @LalitPoptani, рекурсивный вызов метода генерирует это исключение. Я использую Андроид 2.3. Пожалуйста, поделитесь своим мнением. - person MKJParekh; 10.05.2014