ListView - getView вызывается слишком много раз - PullRequest
9 голосов
/ 06 февраля 2012

Я знаю, что есть несколько вопросов относительно этой проблемы 'getView, вызываемого несколько раз', ​​но моя проблема немного отличается.

У меня есть собственный listView с пользовательской строкой (используется 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;
}

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

1 Ответ

10 голосов
/ 06 февраля 2012

Цитата инженер-андроид RomainGuy

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...