Android 正在更新SimpleCorsOrtreeAdapter的子级
我正在使用SimpleCursorTreeAdapter在数据库中显示数据。我正在使用加载程序来管理所有的游标。一切正常。但是在每个子视图中都有一些图像。这会在滚动时引起明显的口吃。所以我想使用一个异步任务来解码背景中的图像。类似于伪代码:Android 正在更新SimpleCorsOrtreeAdapter的子级,android,expandablelistadapter,simplecursortreeadapter,Android,Expandablelistadapter,Simplecursortreeadapter,我正在使用SimpleCursorTreeAdapter在数据库中显示数据。我正在使用加载程序来管理所有的游标。一切正常。但是在每个子视图中都有一些图像。这会在滚动时引起明显的口吃。所以我想使用一个异步任务来解码背景中的图像。类似于伪代码: @Override protected void
@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 ??
}
}
当imageview在onPostExecute函数中准备好时,bindChildView中提供的视图可能已被回收并指向不同的子元素。如何确定将imageview附加到何处 首先,不要附加。无论如何,您都需要图像视图。让ImageView使用占位符图像,在准备好后用最终图像替换
第二,考虑使用现有的知道适配器再循环的库,例如。诚然,我不知道毕加索是否支持ExpandableListAdapter,因为我很少使用ExpandableListView
如果确定没有合适的库,那么在getChildView和/或getGroupView方法中需要一些逻辑来处理回收和后台工作。一种相当简单的方法是通过setTag将ImageView所需的图像URL塞入ImageView的标记中。然后,onPostExecute可以将刚下载的URL与ImageView标记中的URL进行比较,如果不匹配,则不要更新ImageView。这意味着您将不必要地下载一些图像,因此更复杂的方法将安排取消正在下载图像的异步任务。我确信还有其他方法。我也想过使用setTag方法。但我不知道如何获取视图列表,以便循环查找所需的视图。此外,是否存在种族条件?如果用户在我确定要更新哪个视图后立即滚动离开该怎么办?这让我抓狂:-你说你很少使用ExpandableListView。还有什么其他的UI模式可以用来对数据进行分组?@user3459908:但是我不知道如何获取视图列表,我可以循环找到所需的视图-抱歉,但我不明白这一点。这让我抓狂——这就是为什么我建议使用一个现有的库来处理这个模式,如果你能找到一个与ExpandableListAdapter一起工作的库的话。还有哪些其他UI模式可用于分组数据许多应用程序使用顺序列表视图。如果你使用Gmail,他们不会使用ExpandableListView来显示标签和对话;他们分别使用一个列表视图。啊!我现在明白了。。我可以简单地在asynctask构造函数中传递带有标记集的视图。无需查找所有视图并对其进行迭代。我最终使用了以下代码:。效果很好。