0

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

4

1 回答 1

0

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

其次,考虑使用了解Adapter回收利用的现有图书馆,例如Picasso。诚然,我不知道 Picasso 是否支持ExpandableListAdapter,因为我很少使用ExpandableListView.

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

于 2014-04-11T11:51:37.063 回答