2013-07-16 2 views
1

Я использую ListView для отображения TextViews в некоторых строках, а не для других. Я не знаю, сколько предметов там будет, он работает нормально, но когда я прокручиваю вниз, дисплей изменился.

Например: Если у меня есть 10 элементов в ListView, и только 5 из них в настоящее время видны. Адаптер правильно возвращает позиции от 0 до 4 ... это нормально. Когда я прокручиваю позицию позиции 10 и вернусь к вершине, я получаю все мои предметы, похожие на первый элемент в списке, и если я прокручиваю много раз, я получаю первый элемент, повторяемый 10 раз.Я теряю данные, когда прокручиваю свой ListView в Android

Im using ArrayAdapter.
Вот код:

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     PlanningHolder holder = null; 
     if (row == null) { 
      row = mInflater.inflate(layoutResourceId, parent, false); 

      holder = new PlanningHolder(); 
      holder.numberOfJour = (TextView) row.findViewById(R.id.numberDate); 
      holder.lay = (LinearLayout) row.findViewById(R.id.layPlage); 

      row.setTag(holder); 
     } else { 
      holder = (PlanningHolder) row.getTag(); 
     } 

     if(position%2 == 1){ 
      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
        LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 

      params.setMargins(50, 5, 30, 5); 
      //MarginLayoutParams marginLayoutParams = (MarginLayoutParams) params.getLayoutParams(); 

      //marginLayoutParams.setMargins(marginleft, 5, display.getWidth() - marginright, 5); 
      TextView newplage = new TextView(context); 
      newplage.setLayoutParams(params); 
      newplage.setBackgroundColor(context.getResources().getColor(R.color.darkorrange)); 

      holder.lay.addView(newplage); 
     } 

     holder.numberOfJour.setText(myPlannig.getCurrent().get(Calendar.DAY_OF_MONTH) + ""); 

     row.setId(position); 
     return row; 
    } 

и это моя ListView декларация:

<ListView 
    android:id="@+id/list_planning" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/top_shadow" 
    android:scrollingCache="true" 
    android:dividerHeight="1dp"> 
</ListView> 

ответ

3

Проблема вызвана повторным использованием convertView. Либо отключить неисправный

оптимального качества
View row = null; 

или ремонтные оптимизации пути внедрения else ветви if и установить row взгляды numberDate, layPlage соответствующими для этого случая.

Обратите внимание, что вы добавляете виды в holder.lay, но вы никогда не удаляете их. Они накапливаются при прокрутке и повторном использовании convertView.

+0

спасибо за ответы, но в том случае, еще я не буду мой 'holder.lay' без каких-либо взглядов. –

+0

Поэтому удалите их из 'holder.lay' в' else'. –

+0

большое спасибо за ans –

2

Это обычный случай в виде списка. Вы должны правильно обрабатывать регистр if и else.

Например, если вы установили текст в случае if, а не в другом случае, то старое значение будет сохранено. Представления в виде списка возвращаются.

Когда вы впервые открываете просмотр списка, он создается.

При прокрутке вперед и назад вы загружаете данные по уже существующему виду, которое уже имеет значения.

Независимо от того, что вы обрабатываете в случае if в пределах getView, вероятно, вы должны отменить его в другом месте. Другими словами, вы должны обрабатывать представления в каждом случае или пути, который код передает в методе getView.

0

Помещенный другое состояние, как этого

else 
{ 
lay.addView(newplage); 
} 
Смежные вопросы