矢量drawable装载在RecyclerView中

时间:2018-03-28 11:59:55

标签: android caching android-recyclerview picasso

我需要根据不同的情况将VectorDrawable资源加载到recycler-view中的imageview中。当前的实现每次实例化一个新的drawable,我相信,这会导致列表中的大量项目导致性能下降。我想改变它,以便有效地重用drawables来减少创建对象的数量。我正在使用Picasso,我认为将这项工作委托给它可能是一个好主意,但看起来Picasso无法加载VectorDrawable' s。有办法管理吗?

UPD。 使用ContextCompat.getDrawable加载资源,并使用setImageDrawable进行设置。在onViewRecycled

中清除ImageView drawable

1 个答案:

答案 0 :(得分:0)

我能想到的唯一解决方案是将动态可绘制图像从UI线程加载到后台线程。要使加载更加平滑,您需要使用适配器中的AsyncTask异步加载图像。这将消除UI线程的负担并使用户体验更好。你无法使用Picasso,因此我推荐一个简单的AsyncTask。

我找到了一个很好的代码片段,看看:

public View getView(int position, View convertView,
        ViewGroup parent) {
    ViewHolder holder;

    ...

    holder.position = position;

    new ThumbnailTask(position, holder)
            .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);

    return convertView;
}

private static class ThumbnailTask extends AsyncTask {
    private int mPosition;
    private ViewHolder mHolder;

    public ThumbnailTask(int position, ViewHolder holder) {
        mPosition = position;
        mHolder = holder;
    }

    @Override
    protected Cursor doInBackground(Void... arg0) {
        // Download bitmap here
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (mHolder.position == mPosition) {
            mHolder.thumbnail.setImageBitmap(bitmap);
        }
    }
}

private static class ViewHolder {
    public ImageView thumbnail;
    public int position;
}

有关详细信息,请查看this链接。