Обновление потомков SimpleCursorTreeAdapter

Я использую 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, могло быть переработано и указывало на какой-либо другой дочерний элемент. Как определить, куда добавить изображение?

1 ответ

Решение

Во-первых, не добавляйте. Вам нужно ImageView там все равно. Есть ImageView используйте изображение-заполнитель, которое вы замените окончательным изображением, когда оно будет готово.

Во-вторых, рассмотрите возможность использования существующей библиотеки, которая знает о Adapter переработка, такая как Пикассо. Правда, я не знаю, есть ли у Пикассо поддержка ExpandableListAdapter, как я редко использую ExpandableListView,

Если вы решите, что подходящей библиотеки нет, вам понадобится немного логики getChildView() и / или getGroupView() методы, которые могут иметь дело с переработкой и вашей фоновой работой. Один довольно простой подход заключается в том, чтобы подправить URL изображения, необходимого для ImageView в теге ImageView с помощью setTag(), Ваш onPostExecute() Затем можно сравнить только что загруженный URL-адрес с URL-адресом из ImageView тег, и если они не совпадают, не обновляйте ImageView, Это означает, что вы будете загружать некоторые изображения без необходимости, поэтому более сложный подход поможет отменить AsyncTask это загрузка изображения. И я уверен, что есть и другие подходы.

Другие вопросы по тегам