【问题标题】:Image change when i scroll listview滚动列表视图时图像更改
【发布时间】:2016-03-10 02:03:37
【问题描述】:

在我的应用程序中,我从url 加载图像并使用listview 在imageview 中显示它 但是当我滚动 listview 时,image 会发生变化。

这是我的代码:

列表适配器:

class DataAdapter extends ArrayAdapter<ArtistClass>{
    public DataAdapter() {
        super(Activity.this,
                android.R.layout.simple_list_item_1,datalist);
    }

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

        View item=convertView;
        if(item==null){
            LayoutInflater inflater=getLayoutInflater();
            item=inflater.inflate(R.layout.listview, parent,false);
        }

        ArtistClass p=datalist.get(position);

     TextView artistnametxt=(TextView)item.findViewById(R.id.artistnametxt);
     ImageView artistimage=(ImageView)item.findViewById(R.id.artistimage);
        String ospartistname=p.getartistname();
        artistnametxt.setText(ospartistname);
        String artistimageurl=p.getartistimage();
        new DownloadImageTask(artistimage).execute(artistimageurl);

        return (item);

    }

} 

及其从url加载图片的功能:

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

    public DownloadImageTask(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);
    }
  }
}

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    因为您异步加载图像。这意味着当图像加载完成时,listview 适配器使用旧的 imageView 来保存和显示图像。

    在设置位图之前,您应该始终将 null 或一些默认图像设置为 imageiew。

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

    根据我的建议,您应该改用 Glide 或 Piccaso 之类的图像加载库。

    【讨论】:

      【解决方案2】:

      首先,不要使用listview,而是使用新的RecyclerView。 使用 recyclerview,您可以为数据中的每个元素创建一个专用的 ViewHolder。

      其次,你需要在加载后缓存Bitmap,当项目不在屏幕上时,视图和位图被回收以在视图再次出现在屏幕上时重新使用,但持有者丢失了位图引用并自动设置一个“位于某些视图上的随机”位图。

      为了防止这种情况,例如创建或使用缓存类 LruCache。

      参考资料: http://developer.android.com/reference/android/util/LruCache.html http://developer.android.com/intl/pt-br/training/displaying-bitmaps/process-bitmap.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-03
        • 2013-01-21
        • 1970-01-01
        • 2014-05-12
        相关资源
        最近更新 更多