2016-05-06 1 views
1

Я хотел бы отображать элементы с адаптером в ListView, но когда getView вызывается в ArrayAdapter, он отображает хорошее изображение, но не на хорошем элементе, когда я прокручиваю. Это похоже на то, что findViewById не дал мне хорошего идентификатора макета.Android ListView getView отображаемое изображение случайно

public class ItemPackAdapter extends ArrayAdapter<Pack> { 
Context context; 

public ItemPackAdapter(Context context, ArrayList<Pack> pack) { 
    super(context, 0, pack); 
    this.context = context; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    // Check if an existing view is being reused, otherwise inflate the view 
    final Pack pack = getItem(position); 
    if (convertView == null) { 
     convertView = LayoutInflater.from(context).inflate(R.layout.item_pack, parent, false); 
     holder = new ViewHolder(); 
     holder.textView1 = (TextView) convertView.findViewById(R.id.textView1); 
     holder.textView2 = (TextView) convertView.findViewById(R.id.textView2); 
     holder.textView3 = (TextView) convertView.findViewById(R.id.textView3); 
     holder.imageView = (ImageView) convertView.findViewById(R.id.imageView); 
     if (!pack.getImageName().equals("null")) { 
      UrlGenerator urlGenerator = new UrlGenerator(); 
      String url = urlGenerator.getDownloadPicture(pack.getImageName()); 
      DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext()); 
      downloadPicture.start(); 
     } 
     convertView.setTag(holder); 
    } 
    else { 
     holder = (ViewHolder)convertView.getTag(); 
    } 
    holder.textView1.setText(pack.getSomething1()); 
    holder.textView2.setText(pack.getSomething2()); 
    holder.textView3.setText(pack.getSomething3()); 
    if (!pack.getImageName().equals("null")) { 
     UrlGenerator urlGenerator = new UrlGenerator(); 
     String url = urlGenerator.getDownloadPicture(pack.getImageName()); 
     DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext()); 
     downloadPicture.start(); 
    } 
    if(pack.getImageName().equals("null")){ 
     holder.imageView.setImageBitmap(null); 
    } 
    return convertView; 
} 
static class ViewHolder { 
    TextView textView1; 
    TextView textView2; 
    TextView textView3; 
    ImageView imageView; 
} 
} 

На самом деле я нашел решение с:

if(pack.getImageName().equals("null")){ 
     holder.imageView.setImageBitmap(null); 
    } 

Но когда я прокрутке на ListView, я могу видеть изображение в неправильном пункте, и мне нужно прокрутить еще раз, чтобы позвонить GetView в удалите изображение с предыдущим условием. Я хотел бы что-то более чистое: p

Заранее спасибо. И извините за мой плохой английский.

+1

Этот вопрос связан с утилизацией взглядов. Чтобы избежать этой проблемы, вы можете использовать 'Picasso' или любую другую библиотеку загрузки изображений. –

ответ

0

В этом случае, если вы не кэшировать изображение, которое может дать вам как эту проблему. Использование Библиотека Picasso настоятельно рекомендуется для устранения этой проблемы. Добавьте библиотеку picasso в свой проект, а затем напишите свой код примерно так.

Picasso.with(getApplicationContext()).load(url).into(holder.imageView); 

вместо этой линии

DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext()); 
downloadPicture.start(); 
+0

Я не знал эту библиотеку, спасибо – gfitas

1

Ваш внешний вид кода будет работать только с небольшой настройкой. Я обнаружил, что вы настраивали в ImageView дважды, так что я изменить свой код, как показано ниже

public class ItemPackAdapter extends ArrayAdapter<Pack> { 
    Context context; 
    ArrayList<Pack> packs; 

    public ItemPackAdapter(Context context, ArrayList<Pack> packs) { 
     super(context, 0, packs); 
     this.context = context; 
     this.packs = packs; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     // Check if an existing view is being reused, otherwise inflate the view 
     final Pack pack = packs.get(position); 
     if (convertView == null) { 
      convertView = LayoutInflater.from(context).inflate(R.layout.item_pack, parent, false); 
      holder = new ViewHolder(); 
      holder.textView1 = (TextView) convertView.findViewById(R.id.textView1); 
      holder.textView2 = (TextView) convertView.findViewById(R.id.textView2); 
      holder.textView3 = (TextView) convertView.findViewById(R.id.textView3); 
      holder.imageView = (ImageView) convertView.findViewById(R.id.imageView); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     if (pack.getImageName().equals("null")) { 
      holder.imageView.setImageBitmap(null); 
     } else { 
      UrlGenerator urlGenerator = new UrlGenerator(); 
      String url = urlGenerator.getDownloadPicture(pack.getImageName()); 
      DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext()); 
      downloadPicture.start(); 
     } 
     holder.textView1.setText(pack.getSomething1()); 
     holder.textView2.setText(pack.getSomething2()); 
     holder.textView3.setText(pack.getSomething3()); 

     return convertView; 
    } 

    static class ViewHolder { 
     TextView textView1; 
     TextView textView2; 
     TextView textView3; 
     ImageView imageView; 
    } 
} 
+0

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