清一色 有没有人使用带有Gallery小部件的CursorAdapter?有很多例子显示Gallery和BaseAdapter(Array)作为其数据存储。
我的用例是从SQLite游标驱动Gallery。光标具有要显示的ImageURL。
我一直在其他ListViews中使用DroidFu的ImageLoader(带有ImageView)来异步下载图像。
但这似乎与Gallery无关。它(图库)不喜欢回复它的处理程序。
所以... 有关基于URL的图像的AsyncDownload的Gallery和Cursor适配器模式的想法吗?
由于
答案 0 :(得分:2)
是的,但是我使用了我自己的图像加载器实现,非常类似于DroidFu(内存/文件缓存,线程和非线程图像加载)。并且看起来你无法通过具有Gallery + Cursor Adapter设置的线程加载图像,否则你会得到一个非常不连贯的滚动,而不是一个连续的平滑滚动。
下面是一个示例代码,我对列表,图库和网格视图使用相同的游标适配器。
public class CatalogCursorAdapter extends CursorAdapter {
private Context context = null;
private HLBitmapManager iMan;
private CatalogViewHolder holder;
private final LayoutInflater inflater;
private int layout;
public CatalogCursorAdapter(Context context, Cursor c, int layout)
{
super(context, c, true);
inflater = LayoutInflater.from(context);
this.layout = layout;
this.context = context;
iMan = new HLBitmapManager(context.getCacheDir());
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
final View view = inflater.inflate(layout, parent, false);
return view;
}
@Override
public void bindView(View v, Context context, Cursor c) {
String brandName = c.getString(c.getColumnIndex("display_name"));
String category = c.getString(c.getColumnIndex("display_price"));
String imgUrl = c.getString(c.getColumnIndex("img_url"));
holder = (CatalogViewHolder) v.getTag();
if(holder == null) {
holder = new CatalogViewHolder(v);
v.setTag(holder);
}
Bitmap image;
switch (this.layout) {
case R.layout.catalog_list_row:
holder.title.setText(brandName);
holder.sub_title.setText(category);
iMan.fetchBitmapOnThread(imgUrl, Constants.EVENT_LISTVIEW_IMG_WIDTH, Constants.EVENT_LISTVIEW_IMG_HEIGHT, holder.icon);
break;
case R.layout.catalog_grid_cell:
iMan.fetchBitmapOnThread(imgUrl, Constants.EVENT_LISTVIEW_IMG_WIDTH, Constants.EVENT_LISTVIEW_IMG_HEIGHT, holder.icon);
break;
case R.layout.catalog_slide_cell:
image = iMan.fetchBitmap(imgUrl, Constants.EVENT_LISTVIEW_IMG_WIDTH, Constants.EVENT_LISTVIEW_IMG_HEIGHT);
holder.icon.setImageBitmap(image);
break;
}
holder.icon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
}
}