Java 本地加载listview图标,寻找最有效的流程
我试图有效地将我的本地可绘制文件(从我的res>可绘制文件夹)加载到我的列表项中。我希望在加载图像时使用尽可能少的内存 我最初在模型中将我的资源名(R.drawable.list_图标)定义为Java 本地加载listview图标,寻找最有效的流程,java,android,android-listview,android-drawable,smooth-scrolling,Java,Android,Android Listview,Android Drawable,Smooth Scrolling,我试图有效地将我的本地可绘制文件(从我的res>可绘制文件夹)加载到我的列表项中。我希望在加载图像时使用尽可能少的内存 我最初在模型中将我的资源名(R.drawable.list_图标)定义为int,并在适配器中调用setImageResource以应用该图标 但是,在查看API文档之后,它建议我使用setImageDrawable或setImageBitmap,因为它们不是在UI线程上运行的。我需要知道下面的代码是否是一个好方法,其中我将可绘制图像转换为位图并使用了setImageBitmap
int
,并在适配器中调用setImageResource
以应用该图标
但是,在查看API文档之后,它建议我使用setImageDrawable
或setImageBitmap
,因为它们不是在UI线程上运行的。我需要知道下面的代码是否是一个好方法,其中我将可绘制图像转换为位图并使用了setImageBitmap
,并且在AsyncTask
中加载本地图像是否值得合并(因为我也看到过使用这种方法)
模型
适配器
我这里的主要问题是加载本地绘图的最有效方式是什么,这些图像图标的质量非常高,不仅仅是简单的单色图标,它们是实际的产品图像。尝试使用UniversalImageLoader。它不仅适用于从网络加载图像。有许多库可以处理这种效率。你试过毕加索、Glide或UniversalImageLoader吗?我听说过,还没有试过。这就是为什么我发布这个问题来衡量其他人(关心效率和内存使用)是如何在listview中加载本地可绘制内容的。我认为大多数库都是为了从web上加载图像而设计的,而不是本地绘图。你知道有哪家对本地资源进行这种类型的优化吗?毕加索和格莱德也可以加载本地图像并处理效率!我用过毕加索,它非常简洁、快速!谢谢@Pavlos我会调查的谢谢,我会调查的
public class ProductItem {
public int listIcon;
public String listTitle;
public String listDesc;
public ProductItem(int listIcon, String listTitle,
String listDesc) {
this.listIcon = listIcon;
this.listTitle = listTitle;
this.listDesc = listDesc;
}
public int getIconID() {
return listIcon;
}
}
public class ProductAdapter extends ArrayAdapter<ProductItem> {
Context context;
int layoutResourceID;
ProductItem data[];
ProductHolder viewHolder;
public ProductAdapter(Context context, int layoutResourceID, ProductItem[] data) {
super(context, layoutResourceID, data);
this.layoutResourceID = layoutResourceID;
this.context = context;
this.data = data;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(layoutResourceID, parent, false);
viewHolder = new ProductHolder();
viewHolder.productType = (TextView) convertView.findViewById(R.id.itemTitle);
viewHolder.productDesc = (TextView) convertView.findViewById(R.id.itemSubtitle);
viewHolder.productImage = (ImageView) convertView.findViewById(R.id.itemIcon);
convertView.setTag(viewHolder);
} else {
viewHolder = (ProductHolder) convertView.getTag();
}
ProductItem objectItem = data[position];
if (objectItem != null) {
viewHolder.productType.setText(objectItem.listTitle);
viewHolder.productType.setTag(objectItem.listTitle);
viewHolder.productDesc.setText(objectItem.listDesc);
viewHolder.productDesc.setTag(objectItem.listDesc);
// Im currently using the following method for obtain the resource.
InputStream is = context.getResources().openRawResource(objectItem.getIconID());
final Bitmap imageBitmap = BitmapFactory.decodeStream(is);
viewHolder.productImage.setImageBitmap(imageBitmap);
// Im using 'setImageBitmap' since it doesnt run on the UI thread, hoping that this will in return load quicker.
// However i was previously using the following.
// viewHolder.productImage.setImageResource(objectItem.getIconID());
viewHolder.productImage.setTag(objectItem.listIcon);
}
return convertView;
}
static class ProductHolder {
public TextView productType;
public TextView productDesc;
public ImageView productImage;
}
}
listData[0] = new ProductItem(R.drawable.list_icon, getString(R.string.list_title), getString(R.string.list_description));