2014-10-16 6 views
1

Мое приложение имеет строки listview и listview, состоящие из imageView и Textview. Приложение загружает изображения из Интернета, чтобы установить изображение в макете строк. У меня возникла проблема с загрузкой изображений при переходе вверх и вниз по списку. По этой причине я использовал шаблон ViewHolder, чтобы сохранить элементы списка. Проблема была исправлена, но на этот раз у меня возникла новая проблема.Позиция элементов в списке меняется при прокрутке списка.

В Listview имеется 15 строк. Поэтому элементы внизу списка не отображаются. Когда я прокручиваю список, чтобы увидеть элементы, элементы в верхней части списка заканчиваются lisview. Также, когда я скручиваю список, элементы в конце списка входят в список.

Поэтому он не отображает значения или строки, которые необходимо отображать.

последнее состояние метода

мой GetView() является ..

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


     ViewHolder viewHolder; 

      if (convertView == null) { 

       convertView = mInflater.inflate(R.layout.row_layout, null); 

       TextView programName = (TextView)convertView.findViewById(R.id.programName); 
       TextView programTime = (TextView)convertView.findViewById(R.id.programTime); 
       TextView programState = (TextView)convertView.findViewById(R.id.programState); 
       ImageView programImage = (ImageView)convertView.findViewById(R.id.programImage); 


       programName.setText(values.programNames.get(position)); 
       programTime.setText(values.programTimes.get(position)); 
       new imageDownload(programImage).execute(values.programImageUrls.get(position)); 

       viewHolder = new ViewHolder(); 
       viewHolder.p_Name = programName; 
       viewHolder.p_Time = programTime; 
       viewHolder.p_State = programState; 
       viewHolder.p_Image = programImage; 

       convertView.setTag(viewHolder); 

      }else{ 

       viewHolder = (ViewHolder) convertView.getTag(); 
      } 

      return convertView; 
     } 

мой взгляд Holder ...

public static class ViewHolder { 
    TextView p_Name; 
    TextView p_Time; 
    TextView p_State; 
    ImageView p_Image; 
} 

Спасибо вам много

ответ

2

Переместить это за пределами того, где вы создали ваш convertview

programName.setText(values.programNames.get(position)); 
programTime.setText(values.programTimes.get(position)); 
new imageDownload(programImage).execute(values.programImageUrls.get(position)); 

Так что это выглядит как этот

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


    ViewHolder viewHolder; 

     if (convertView == null) { 

      convertView = mInflater.inflate(R.layout.row_layout, null); 

      TextView programName = (TextView)convertView.findViewById(R.id.programName); 
      TextView programTime = (TextView)convertView.findViewById(R.id.programTime); 
      TextView programState = (TextView)convertView.findViewById(R.id.programState); 
      ImageView programImage =(ImageView)convertView.findViewById(R.id.programImage); 



      viewHolder = new ViewHolder(); 
      viewHolder.p_Name = programName; 
      viewHolder.p_Time = programTime; 
      viewHolder.p_State = programState; 
      viewHolder.p_Image = programImage; 

      convertView.setTag(viewHolder); 

     }else{ 

      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.p_Name.setText(values.programNames.get(position)); 
     viewHolder.p_Time.setText(values.programTimes.get(position)); 
     new imageDownload(programImage).execute(values.programImageUrls.get(position)); 


     return convertView; 
    } 

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

+1

Вместо этого вы хотите привязать его к viewholder.p_name.setText(), поскольку текстовое представление programName выходит за рамки инструкции if/else. – MrPancake

+0

Вы верны для определенных (фиксированных) –

-1

Вы должны иметь значение позиции в классе ViewHolder, чтобы вы могли сравнить позицию получаемого ViewHolder с convertView.getTag() , Если convertView не является нулевым, вы хотите убедиться, что у вас есть правильная информация в представлении.

if (viewHolder.position != position) { 
    //retrieves the correct position of the information 
    viewHolder.p_Name.setText(values.programNames.get(position)); 

    //etc 
    viewHolder.position = position; 
} 
0

Благодарим за ответы. Я решил использовать Picasso для изображений. Я просто изменил код, как показано ниже

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

ViewHolder viewHolder; 

    if (convertView == null) { 

     convertView = mInflater.inflate(R.layout.row_layout, null); 

     TextView programName = (TextView)convertView.findViewById(R.id.programName); 
     TextView programTime = (TextView)convertView.findViewById(R.id.programTime); 
     TextView programState = (TextView)convertView.findViewById(R.id.programState); 
     ImageView programImage =(ImageView)convertView.findViewById(R.id.programImage); 

     viewHolder = new ViewHolder(); 
     viewHolder.p_Name = programName; 
     viewHolder.p_Time = programTime; 
     viewHolder.p_State = programState; 
     viewHolder.p_Image = programImage; 

     convertView.setTag(viewHolder); 

    }else{ 

     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
      viewHolder.p_Ad.setText(values.programIsimleri.get(position)); 
      viewHolder.p_Saat.setText(values.programSaatleri.get(position)); 
    Picasso.with(getApplicationContext()).load(values.programImageUrls.get(position)).into(viewHolder.p_Image); 


    return convertView; 
} 

Код работает правильно.