我正在使用SimpleCursorTreeAdapter来显示数据库中的数据。我正在使用加载器来管理所有游标。一切都很好。但是在每个孩子的视图中都有一些图像。这会在滚动时引起明显的口吃。因此,我想使用异步任务来解码背景中的图像。类似于(伪码):
@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()函数中准备就绪时,bindChildView中提供的视图可能已经被回收,并指向了一些不同的子元素。如何确定在何处追加图像视图?
发布于 2014-04-11 11:51:37
首先,不要附加。无论如何,你需要ImageView。让ImageView使用占位符图像,当最终图像准备就绪时,将其替换为最终图像。
第二,考虑使用一个了解Adapter回收的现有库,例如毕加索。诚然,我不知道毕加索是否支持ExpandableListAdapter,因为我很少使用ExpandableListView。
如果确定没有合适的库,则需要getChildView()和/或getGroupView()方法中的一些逻辑来处理回收和背景工作。一种非常简单的方法是将ImageView所需的图像的URL通过setTag()放到ImageView的标记中。然后,您的onPostExecute()可以将它刚刚下载的URL与来自ImageView标记的URL进行比较,如果它们不匹配,则不要更新ImageView。这意味着您将不必要地下载一些图像,因此更复杂的方法将安排取消正在下载图像的AsyncTask。我相信还有其他办法。
https://stackoverflow.com/questions/22958402
复制相似问题