2014-10-24 3 views
0

Привет, я заполняю свой ListView базовым адаптером, здесь загружает изображение с URL-адреса, затем я устанавливаю результат BitMap в ImageView внутри строки xml. Он отлично работает, но когда я просматриваю изображения, появляется и исчезает в разных местах.Изображения с URL-адреса появляются и исчезают в прокрутке ListView

Это мой код:

активность:

public class MyActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity); 

     lvData = (ListView) findViewById(R.id.listview1); 

     AdapterClass adapter = new AdapterClass(this, String[] urls); 

     lvData.setAdapter(adapter); 
    } 
} 

адаптер:

public class PopularAdapter extends BaseAdapter { 

    private String[] mList; 
    private LayoutInflater mLayotInflalter; 

    public PopularAdapter(Context context, String[] list) { 
     mList = list; 
     mLayotInflalter = ((Activity) context).getLayoutInflater(); 
    } 

    @Override 
    public int getCount() { 
     return mList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

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

     if (convertView == null) { 
      convertView = mLayotInflalter.inflate(R.layout.row, null); 
      wrapper = new WrapperRow (convertView); 

      convertView.setTag(wrapper); 
     } else 
      wrapper = (WrapperRow) convertView.getTag(); 

     // // 

     new DownloadImage(wrapper.getImageView()).execute(mList.[position]); 

     return convertView; 
    } 

} 

Image Downloader Класс:

public class DownloadImage extends AsyncTask<String, Void, Bitmap> { 
    ImageView bmImage; 

    public DownloadImage(ImageView bmImage) { 
     this.bmImage = bmImage; 
    } 

    protected Bitmap doInBackground(String... urls) { 
     String urldisplay = urls[0]; 
     Bitmap mIcon11 = null; 
     try { 
      InputStream in = new java.net.URL(urldisplay).openStream(); 
      mIcon11 = BitmapFactory.decodeStream(in); 

     } catch (Exception e) { 
      Log.e("Error", e.getMessage()); 
      e.printStackTrace(); 
     } 
     return mIcon11; 
    } 

    protected void onPostExecute(Bitmap result) { 
     bmImage.setImageBitmap(result); 
    } 
} 

Вы можете мне помочь? : D

+0

Попробуйте использовать библиотеку, чтобы справиться с этим. Я знаю, что это не ответ, но я бы рекомендовал использовать [Android-Universal-Image-Loader] (https://github.com/nostra13/Android-Universal-Image-Loader) – ezcoding

ответ

3

Это происходит потому, что представления возвращаются в ListView. This Ответ хорошо объясняет, как работает механизм рециркуляции. Теперь, приступив к вашему делу, всякий раз, когда getView вызывается в вашем адаптере, вы начинаете новый AsyncTask, который загружает изображение с заданным URL и устанавливает его в imageView внутри WrapperRow.

Давайте посмотрим, почему именно взгляды мерцают. Учтите, что у вас есть строки-оболочки - wr1, wr2, wr3 .... wr8, и они возвращаются в listView (я произвольно решил объяснить с помощью 8 строк. ListView мог бы использовать меньше или больше). Как только getView вызывается в первый раз, вы надуваете строку-обертку (wr1), а затем передаете ее в AsyncTask, которая загружает изображение &, а затем устанавливает его. Теперь вы просматриваете список, и тот же процесс происходит для просмотров wr2 на wr8, а при дальнейшей прокрутке пришло время перерабатывать виды, а wr1 снова воспроизводится. Вы загружаете еще один asyncTask для загрузки изображения, но вы никогда не очищали imageView (он уже содержит первое изображение сейчас), и когда задача выполняется загрузка, он устанавливает новое изображение в режиме просмотра изображений, и это происходит, когда вы исчезаете, и новое изображение появление. Когда вы просматриваете список, вы видите, что это происходит неоднократно для всех строк!

Вы можете использовать любого из библиотек, как Picasso или UIL, но если вы хотите раскрутить свою собственную реализацию помните эти вещи

  • Не держит на сильные ссылки взглядов в asyncTasks (это предотвратит экземпляр активности из GC, даже если он будет уничтожен, что приведет к утечкам памяти)
  • Когда вы начинаете новый asyncTask, обязательно отмените предыдущую asyncTask (если есть), которая все еще работает с этим видом.
  • И всегда лучше использовать кэш (память &)
+0

С уважением, я стараюсь использовать это библиотеки и спасибо за объяснение –

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