2013-03-05 4 views
0

У меня есть ListView, который должен отображать элементы, содержащие текст и изображение.Асинхронное связывание с использованием SimpleCursorAdapter

Данные загружаются из локального файла SQLite db (который содержит URL-адреса и изображения).

Я хотел бы:

  • Получить текст, URL из БД.
  • Асинхронно загружайте изображение по URL
  • Привяжите оба значения к ListView (используя SimpleCursorAdapter).

До сих пор я мог читать значения из БД, однако я не уверен, как я могу выполнить привязку только после того, как я успешно загрузил каждое изображение?

Другими словами, я хотел бы асинхронно связывать каждый элемент, когда он загружается в соответствующий элемент пользовательского интерфейса.

+0

Я предполагаю, что вы используете CursorLoader? – njzk2

+0

нет ... с использованием производного класса AsynTask, который загружает –

ответ

1

Вот хороший пример, который показывает как это http://www.androidkit.com/loading-images-from-remote-server-over-http-on-a-separate-thread.

Вкратце,

1) Вы должны иметь Map<Url, Bitmap>.
2) Имейте изображение по умолчанию, которое отображается, когда данные изображения с сервера пока недоступны.
3) Попросите прослушивателя onScroll для вашего ListView, чтобы узнать, какие элементы отображаются в данный момент.
4) Сначала загрузите те, которые отображаются.
5) После загрузки изображения позвоните по номеру notifyDataSetChanged(), чтобы связать доступное изображение к представлению.
6) Вы можете использовать Softreferences или LRUCache избежать OutofMemoryException

+0

@sajith. Эта веб-страница недоступна. – dvrm

+0

@dvrm выглядит так, как будто они удалили страницу. Вы можете посмотреть похожие вопросы в StackOverFlow. ex http://stackoverflow.com/questions/5458395/loading-images-from-remote-server – sujith

-1

я решил подобную проблему к этому. Я получил XML с сервера и сохранил информацию в базе данных. После этого я заполнил список, используя CursorAdapter. В моем случае у меня есть как изображения, так и текст.

Чтобы решить эту проблему в курсоре адаптере я сделал что-то вроде этого:

@Override 
public void bindView(View v, Context ctx, Cursor c) { 
    TextView title = (TextView) v.findViewById(R.id.titleID); 
    title.setText(c.getString(c.getColumnIndex(yourColumName))); 
    ImageView i = (ImageView) v.findViewById(R.id.ImageID); 
    String s = c.getString(c.getColumnIndex(youtImageColumn)); 
    imageLoader.DisplayImage(s,i); 
} 


@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    View v = inflater.inflate(R.layout.yourRowLayout, parent, false); 
    return v; 
} 

В этом случае ImageLoader является загрузчик асинхронного ленивым образа получил от сюда: https://github.com/thest1/LazyList

Смежные вопросы