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

Я знаю, что есть несколько вопросов, касающихся этой проблемы «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; } 

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

Котировочный инженер-программист RomainGuy

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

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

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