滚动listview

时间:2016-03-09 17:42:46

标签: android android-layout

在我的应用中,我从url加载图片并使用imageviewlistview中显示 但是当我滚动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);
    }
  }
}

2 个答案:

答案 0 :(得分:0)

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

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

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

根据我的建议,您应该使用像GlidePiccaso这样的图片加载库。

答案 1 :(得分:0)

首先,不要使用listview,而是使用新的RecyclerView。 使用recyclerview,您可以在数据中创建一个deDicaded 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