2015-12-15 3 views
0

Я пытаюсь создать listview с каждым элементом списка, и их макеты создаются кодом. Первоначальные макеты выглядят отлично, но когда я прокручиваюсь и все, элементы компоновки, добавленные программно, снова добавляются, что приводит к дублированию элементов. Как я могу решить эту проблему?Элементы, добавляемые к элементу списка несколько раз. Как это исправить?

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     View v = convertView; 
     MyHolder holder; 

     if (v == null) { 
      LayoutInflater li = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = li.inflate(R.layout.empty_item, null); 
      holder = new MyHolder(v); 
      v.setTag(holder); 
     } else { 
      holder = (MyHolder) v.getTag(); 
     } 

     TextView textView = new TextView(activity); 
     textView.setText(items.get(position).getItems().get(i).getText()); 
     textView.setLayoutParams(params); 
     holder.linearLayout.addView(textView); 
     return v; 
     } 

    class MyHolder{ 
     public TextView tvTitle; 
     public LinearLayout linearLayout; 
     public CardView cardView; 
     public MyHolder(View base){ 

      tvTitle = (TextView)base.findViewById(R.id.tvTitle); 
      cardView = (CardView)base.findViewById(R.id.card_view2); 
      linearLayout = (LinearLayout)base.findViewById(R.id.linearLayoutCard); 



     } 
    } 
+0

Зачем добавлять время просмотра текста, пожалуйста, перейдите по https://www.caveofprogramming.com/guest-posts/custom-listview-with-imageview-and-textview-in-android.html – Pavan

+0

Мне нужны динамические макеты в моем приложение. Например, если сервер говорит, что нам нужны 3 кнопки и текстовое представление, я создаю это время выполнения. – user3179249

+1

, в этом случае ваш элемент будет добавлен при изменении состояния списка, например, прокрутке и уведомлении, тогда он будет случайным образом добавлять виды, вы можете добавить holder.linearLayout.removeallview(); перед добавлением вида – Pavan

ответ

1

Я даже не знаю, как этот код работает, потому что у вас нет возврата заявление в вашем методе getView(). Но вам нужно вернуть convertView в getView(), чтобы ListView мог повторно использовать их, когда это необходимо. В противном случае, он будет просто продолжать запрашивать новые представления каждый раз, когда они им понадобятся. Таким образом, вы просто положили return v; в конце getView().

Кроме того, вы создаете и добавляете новые TextViews в свои объекты MyHolder за пределами блока if (v == null). Обычно вы должны создавать новые представления, например, если convertView имеет значение NULL. Если это не так, вы просто передаете его в ListView или обновляете его, прежде чем передавать его обратно. Итак, что происходит, есть convertView (но не null), но вместо того, чтобы использовать его, вместо этого вы добавляете новый TextView, поэтому вы получаете дубликаты.

+0

Мой плохой, я обрезал ненужные части и забыл добавить оператор возврата. Существует обратное v; в конце. – user3179249

+0

Смотрите мои правки выше. Вы просто хотите создавать новые представления, когда 'convertView' равно null. Таким образом, проблема, скорее всего, в том, что вы создаете и добавляете TextView даже в том случае, если имеется 'convertView'. Вы просто хотите создавать новые представления, когда 'convertView' равно null. – NoChinDeluxe

+0

Я переместил материал в текстовом виде, если статут и он сработал. Спасибо за четкий и точный андерсер. – user3179249

Смежные вопросы