Обновление потомков 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
это загрузка изображения. И я уверен, что есть и другие подходы.