Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 正在更新SimpleCorsOrtreeAdapter的子级_Android_Expandablelistadapter_Simplecursortreeadapter - Fatal编程技术网

Android 正在更新SimpleCorsOrtreeAdapter的子级

Android 正在更新SimpleCorsOrtreeAdapter的子级,android,expandablelistadapter,simplecursortreeadapter,Android,Expandablelistadapter,Simplecursortreeadapter,我正在使用SimpleCursorTreeAdapter在数据库中显示数据。我正在使用加载程序来管理所有的游标。一切正常。但是在每个子视图中都有一些图像。这会在滚动时引起明显的口吃。所以我想使用一个异步任务来解码背景中的图像。类似于伪代码: @Override protected void

我正在使用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 ??                                                  
        }                                                                                                        
}      

当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构造函数中传递带有标记集的视图。无需查找所有视图并对其进行迭代。我最终使用了以下代码:。效果很好。