更新SimpleCursorTreeAdapter的子项

时间:2014-04-09 09:34:31

标签: android expandablelistadapter simplecursortreeadapter

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

1 个答案:

答案 0 :(得分:0)

首先,不要追加。无论如何你需要ImageView。让ImageView使用占位符图像,在准备就绪时将其替换为最终图像。

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

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