2013-07-18 3 views
2

В моем приложении Android Asyntask используется для загрузки изображений из Интернета в виде списка. Я хочу показать центральную часть изображения, и я попробовал загрузчик изображений для загрузки изображений, но проблема заключается в ясности изображения очень плох, но я использовал его для загрузки эскизов, потому что миниатюра очень маленькая. Так что я попробовал Asyntask, который приведен ниже. Проблема с этим методом - это изображение, показывающее другие изображения, что означает, что просмотр изображения в элементе первого списка покажет изображение следующего элемента списка, и через некоторое время он будет показывать правильный image.How я могу решить этот issue.Or предложить способ накладных изображений с хорошей clarity.Please помощи me.thanks заранееЗагрузка изображения Android в listview

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
    ImageView bmImage; 
    ProgressBar mProgressBar; 
    String url; 

    public DownloadImageTask(ImageView bmImage, ProgressBar progressBar) { 
     this.bmImage = bmImage; 
     this.mProgressBar = progressBar; 
    } 

    @Override 
    protected void onPreExecute() { 
     mProgressBar.setVisibility(View.VISIBLE); 
     super.onPreExecute(); 
    } 

    protected Bitmap doInBackground(String... urls) { 
     String urldisplay = urls[0]; 
     url = urldisplay; 
     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) { 
     Utilities.addBitmapToMemoryCache(url, result); 
     bmImage.setImageBitmap(result); 
     mProgressBar.setVisibility(View.GONE); 
     // result.recycle(); 
    } 
} 

}

public View getView(final int position, View convertView, ViewGroup parent) { 
    vi = convertView; 
    int type = getItemViewType(position); 
    // Utilities.message_player = new MediaPlayer(); 
    if (vi == null) { 
     inflater = LayoutInflater.from(mcontext); 
     if (type == ITEM_TYPE_ONE) 
      vi = inflater.inflate(R.layout.message_group_list_item, null); 
     else 
      vi = inflater.inflate(R.layout.listlastrow, null); 
    } 
    if (type == ITEM_TYPE_ONE) { 
     if (fontType == true) { 

     } 
     ((ImageView) vi.findViewById(R.id.imageMessage)).setTag(position+"i"); 

Bitmap bmp = Utilities.getBitmapFromMemCache(feedsImage); 
        if(bmp == null){ 
        DownloadImageTask dwnloadImgTask = new DownloadImageTask(((ImageView) vi.findViewWithTag(position+"i")), 
          ((ProgressBar) vi.findViewById(R.id.progressBar1))); 
        dwnloadImgTask.execute(feedsImage); 
        }else{ 
         ((ImageView) vi.findViewById(R.id.imageMessage)).setImageBitmap(bmp); 
        } 

} 
} 
+0

Пожалуйста, покажите нам, где и как вы используете эту AsyncTask (вероятно, в вашем коде адаптера списка?) Ошибка может быть в методе getView из адаптера ... – Guian

+0

@Guian getview method добавлен – user1767260

ответ

2

При установке растрового изображения из кэша или загрузки нового изображения, вы что-то не хватает:

Ваш родительский вид (VI), возможно, ранее созданный вид переработаны, чтобы избежать воссоздавая каждый вид на (что то, что convertView для).

У этого конвертированного изображения уже есть изображение, поскольку оно является переработанным элементом, для которого было загружено изображение.

Таким образом, вы должны сбросить содержание просмотра изображения в случае, если у вас есть convertView:

((ImageView) vi.findViewById(R.id.imageMessage)).setTag(position+"i"); 

    Bitmap bmp = Utilities.getBitmapFromMemCache(feedsImage); 
    if(bmp == null){ 
     //HERE I add a line to reset the bitmap of the imageview 
     ((ImageView) vi.findViewById(R.id.imageMessage)).setImageBitmap(null); 

     DownloadImageTask dwnloadImgTask = new DownloadImageTask(((ImageView) vi.findViewWithTag(position+"i")), ((ProgressBar) vi.findViewById(R.id.progressBar1))); 
     dwnloadImgTask.execute(feedsImage); 
    }else{ 
     ((ImageView) vi.findViewById(R.id.imageMessage)).setImageBitmap(bmp); 
    } 

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

Надеюсь, что это поможет.

+0

Благодарим за помощь , Я изменил ваш ответ, а также добавил ((ImageView) vi.findViewById (R.id.imageMessage)). SetImageBitmap (null); в предэкзементном методе asyntask. Теперь первый список показывает неправильные образы против 2 или 3 секунды, а затем показывает правильный. – user1767260

+0

Вам нужно найти, где эти неправильные изображения были установлены вначале. Проверьте yur layout xml для строки item, вы устанавливаете изображение там? – Guian

+0

Да, в макете есть прозрачное изображение. – user1767260

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