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() 関数で imageview の準備が整うまでに、bindChildView で提供されるビューはリサイクルされ、別の子要素を指している可能性があります。イメージビューを追加する場所を決定するにはどうすればよいですか?

4

1 に答える 1

0

まず、追加しないでください。ImageViewとにかくそこが必要です。プレースImageViewホルダー画像を使用して、準備ができたら最終画像に置き換えます。

次に、 PicassoAdapterなど、リサイクルについて知っている既存のライブラリの使用を検討してください。確かに、私はめったに を使用しないため、ピカソが をサポートしているかどうかはわかりません。ExpandableListAdapterExpandableListView

適切なライブラリがないと判断した場合は、getChildView()および/またはgetGroupView()メソッドに、リサイクルとバックグラウンド作業を処理できるロジックが必要になります。非常に簡単な方法の 1 つは、 が必要とする画像の URL をviaImageViewのタグに挿入することです。次に、ダウンロードしたばかりの URL をタグからの URL と比較できます。それらが一致しない場合は、. これは、一部の画像を不必要にダウンロードすることを意味するため、より洗練されたアプローチでは、画像をダウンロードしている をキャンセルするように手配します。そして、他のアプローチもあると確信しています。ImageViewsetTag()onPostExecute()ImageViewImageViewAsyncTask

于 2014-04-11T11:51:37.063 に答える