我正在使用SimpleCursorTreeAdapter在数据库中显示数据。我正在使用加载器来管理所有游标。一切正常。但是每个子视图中都有一些图像。滚动时,这会导致明显的断断续续。所以我想使用asynctask来解码背景中的图像。像(伪代码)的东西:
@Override
protected void bindChildView(View view, Context context, Cursor cursor, boolean isLastChild) {
super.bindChildView(view, context, cursor, isLastChild);
String imgFile = cursor.getString(MyDatabaseHelper.FILE_INDEX);
new asyncLoadImage().execute(imgFile);
}
private class asyncLoadImage extends AsyncTask<String, Void, Bitmap> {
@Override
protected Bitmap doInBackground(String... arg0) {
String imgFile = arg0[0];
return Utils.getBitMap(imgFile);//psuedocode
}
@Override
protected void onPostExecute(Bitmap bm) {
ImageView imageView = new ImageView(mCtx);
imageView.setTag(mID);
imageView.setImageBitmap(bm);
//ok got the imageview. where do I append it ??
}
}
在onPostExecute()函数中准备好imageview时,bindChildView中提供的视图可能已被回收并指向某个不同的子元素。如何确定附加图像视图的位置?
答案 0 :(得分:0)
首先,不要追加。无论如何你需要ImageView
。让ImageView
使用占位符图像,在准备就绪时将其替换为最终图像。
其次,请考虑使用知道Adapter
回收的现有库,例如Picasso。不可否认,我不知道毕加索是否支持ExpandableListAdapter
,因为我很少使用ExpandableListView
。
如果您确定没有合适的库,则需要使用getChildView()
和/或getGroupView()
方法中的某些逻辑来处理回收和后台工作。一种相当简单的方法是通过ImageView
将ImageView
标记中的setTag()
所需图像的网址收起来。然后,您的onPostExecute()
可以将刚刚下载的网址与ImageView
标记中的网址进行比较,如果不匹配,请不要更新ImageView
。这意味着您将不必要地下载一些图像,因此更复杂的方法将安排取消正在下载图像的AsyncTask
。而且我确信还有其他方法。