【问题标题】:Updating children of SimpleCursorTreeAdapter更新 SimpleCursorTreeAdapter 的子节点
【发布时间】:2014-04-09 09:34:30
【问题描述】:

我正在使用 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 中提供的视图可能已经被回收并指向一些不同的子元素。如何确定附加图像视图的位置?

【问题讨论】:

    标签: android expandablelistadapter simplecursortreeadapter


    【解决方案1】:

    首先,不要追加。无论如何,你需要ImageView。让ImageView 使用占位符图像,当它准备好时用最终图像替换。

    其次,考虑使用了解Adapter 回收的现有库,例如Picasso。诚然,我不知道毕加索是否支持ExpandableListAdapter,因为我很少使用ExpandableListView

    如果您确定没有合适的库,则需要在您的 getChildView() 和/或 getGroupView() 方法中添加一些可以处理回收和后台工作的逻辑。一种相当简单的方法是通过setTag()ImageView 所需图像的URL 放入ImageView 的标签中。然后,您的onPostExecute() 可以将它刚刚下载的 URL 与来自 ImageView 标记的 URL 进行比较,如果它们不匹配,则不要更新 ImageView。这意味着您将不必要地下载一些图像,因此更复杂的方法将安排取消正在下载图像的AsyncTask。我相信还有其他方法。

    【讨论】:

    • 我也想过使用 setTag 方法。但我不知道如何获取可以循环查找所需视图的视图列表。而且会不会有比赛条件?如果用户在我确定要更新哪个视图之后立即滚开怎么办?这让我抓狂:-(
    • 你说你很少使用 ExpandableListView。还有哪些其他 UI 模式可用于对数据进行分组?
    • @user3459908:“但我不知道如何获取可以循环查找所需视图的视图列表”——抱歉,但我不明白这一点。 “这让我发疯了”——这就是为什么我建议使用现有的处理模式的库,如果你能找到一个与 ExpandableListAdapter 一起使用的库。 “还有哪些其他 UI 模式可用于对数据进行分组?” -- 许多应用程序使用顺序ListViews。如果您使用 Gmail,他们不会使用 ExpandableListView 来显示标签和对话;他们为每个人使用单独的ListView
    • 啊!我现在明白了.. 我可以简单地在带有标签集的 asynctask 构造函数中传递视图。无需查找所有视图并对其进行迭代。
    • 我最终使用了这里的代码:developer.android.com/training/displaying-bitmaps/…。效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2011-11-14
    相关资源
    最近更新 更多