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