【问题标题】:ListView recycle issueListView 回收问题
【发布时间】:2014-10-15 18:09:36
【问题描述】:

我有一个带有自定义适配器的列表视图,每一行都有一个图像视图,我下载图像以通过 URL 从远程服务器设置,并将其传递给 AsyncTask。我的代码正在运行,但是当我滚动列表视图时,会再次下载已下载的 ImageViews 图像。

我想为第一次创建列表视图下载图像。我研究了很多主题,但我什么都不懂。我该怎么办?

我的自定义适配器在下面...

public ListAdapter(Context context, ProgramInfo values) {

        this.context = context;
        this.values = values;
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      }

       @Override
       public int getCount(){

           return values.getSize();
            }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

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

            View rowView = mInflater.inflate(R.layout.list_row, null);
            TextView programName = (TextView)rowView.findViewById(R.id.programName);
            TextView programTime = (TextView)rowView.findViewById(R.id.programTime);
            TextView programState = (TextView)rowView.findViewById(R.id.programState);
            ImageView programImage = (ImageView)rowView.findViewById(R.id.programImage);


            programName.setText(values.programNames.get(position));
            programTime.setText(values.programTimes.get(position));


            new DownloadImage(programImage).execute(values.programImageUrls.get(position)); // download images


        return rowView;

    }

还有我的 AsyncTask ...

private 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 {
             HttpURLConnection urlConnection = (HttpURLConnection)new URL(urldisplay).openConnection();
             urlConnection.setDoInput(true);
             InputStream in = urlConnection.getInputStream();
             mIcon11 = BitmapFactory.decodeStream(in);
             urlConnection.disconnect();
         } catch (Exception e) {
             Log.e("Error", e.getMessage());
             e.printStackTrace();
         }
         return mIcon11;
     }

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

谢谢...

【问题讨论】:

  • 在列表视图中使用通用图像加载器库进行图像视图
  • 查看视图持有者模式以优化回收。您也可以使用位图缓存...

标签: android listview android-asynctask imageview


【解决方案1】:

在适配器中,getView 中的每一件事都会在每出现一个新行时执行 所以你必须在 getView 中使用 ViewHolder 来保存每一行的元素状态 我们的 if 语句在重新下载之前检查 ImageView 是否为空...... 这是我所说的令人惊叹的例子......

Asynchronous Image Loader In Android ListView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 2011-06-25
    相关资源
    最近更新 更多