#android #android-listview #android-imageview #android-viewbinder
#Android #android-listview #android-просмотр изображений #android-viewbinder
Вопрос:
Есть ли способ, которым я мог бы установить изображение на ImageView
внутри ListView
? В этом я использую a SimpleCursorAdapter
для отображения всех полей и использую a ViewBinder
для установки растрового изображения на ImageView
. Изображение загружается с помощью AsyncTask
. Код, который я написал, приведен ниже:
private void updateTimelineUI() {
Cursor data = dbHelper.query(Constants.TABLE_NAME, null, null);
if (data.moveToFirst()) {
adapter = new SimpleCursorAdapter(this, R.layout.tweet_row, data, new String[] {Constants.CREATED_TIME, Constants.USERNAME, Constants.PROFILE_IMAGE, Constants.TWEET}, new int[] {R.id.time, R.id.username, R.id.userImageView, R.id.tweetMessage});
SimpleCursorAdapter.ViewBinder viewBinder = new SimpleCursorAdapter.ViewBinder() {
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
if(view != null amp;amp; view.getId() != R.id.userImageView) {
return false;
}
String imageUrlString = cursor.getString(columnIndex);
String username = cursor.getString(cursor.getColumnIndex(Constants.USERNAME));
String path = getDir("images", MODE_PRIVATE).getAbsolutePath() "/" username ".png";
ImageDownloader downloader = new ImageDownloader();
downloader.setImageUrlString(imageUrlString);
downloader.setImageView(view);
downloader.setFilePath(path);
downloader.execute(imageUrlString);
return true;
}
};
int index = data.getColumnIndex(Constants.PROFILE_IMAGE);
//Log.d(Constants.TAG, "" index);
adapter.setViewBinder(viewBinder);
viewBinder.setViewValue(userImageView, data, index);
timelineList.setAdapter(adapter);
}
}
Есть ли способ установить изображение в правильную строку с помощью этого метода?
С помощью кода, который у меня есть в настоящее время, изображения загружаются успешно. Однако изображения устанавливаются случайным образом.
Ответ №1:
Вы должны создать свой собственный адаптер, который должен наследоваться от SimpleCursorAdapter, и поэтому вы можете создать свой собственный элемент ListView с вашим пользовательским дизайном и установить для него пользовательский макет, в который вы можете добавить любой элемент пользовательского интерфейса, который вы хотите, включая ImageView
Комментарии:
1. Значит, нет другого способа, кроме написания моего собственного адаптера? Я могу установить изображение в ImageView, но изображение продолжает случайным образом меняться, поэтому мне было интересно, можно ли что-нибудь сделать с текущим кодом.
2. Дело в том, что если вы не создадите свой собственный адаптер во время прокрутки списка, ListItem не будет знать, что и какое изображение отображать, и именно поэтому он будет отображать разные изображения, что приведет к изменению изображений при каждой прокрутке. Вот почему вам нужно внедрить свой собственный адаптер и отслеживать свои элементы в каждом элементе списка.
Ответ №2:
Я создал пользовательский класс, который наследуется от SimpleCursorAdapter
, как упоминает Сердар Догруйол. Внутри этого пользовательского класса I @Override bindView
. Внутри bindView
я вызываю super
, затем получаю дескриптор моего ImageView
использования view.findViewById
, причем view
это один из параметров, переданных в bindView
.