Как добавить изображение из Drawable в ListView заполнить из базы данных
Мне интересно, как добавить изображения из Drawables в мой список. У меня есть ListView с двумя TextViews (идентификатор, активность), которые я получаю из базы данных. Не могли бы вы дать мне несколько советов?:)
Я беру данные с
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.history_list_item, cursor, new String[] { Tracks._ID,
Tracks.ACTIVITY }, new int[] { R.id.id, R.id.activity });
Я хочу отобразить изображение рядом с textview, которое зависит от значения активности.
С уважением
2 ответа
Если я правильно понял ваш вопрос, одним из решений было бы включить ImageView в ваш макет, например так:
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.history_list_item, cursor, new String[] { Tracks.SYMBOL,
Tracks._ID, Tracks.ACTIVITY },
new int[] { R.id.symbol, R.id.id, R.id.activity });
В приведенном выше коде Tracks.SYMBOL - это столбец таблицы с идентификатором ресурса, а R.id.symbol - это идентификатор вашего ImageView. Затем вам нужно будет реализовать интерфейс SimpleCursorAdapter.ViewBinder и установить свою реализацию в адаптер курсора.
Прежде чем мы рассмотрим пример, нужно сделать одно соображение: столбец курсора Tracks.SYMBOL может иметь целые числа со значениями, равными требуемым полям ресурса в классе R.drawable. Это не удобно, так как эти поля генерируются автоматически, поэтому мы не можем контролировать их значения. Одним из решений будет сохранение строки с именем поля класса и использование отражения для получения значений поля.
Вот пример присоединения ViewBinder к ранее определенному адаптеру:
adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
@Override
public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
boolean binded = false;
if (view instanceof ImageView) {
int resourceId R.drawable.default_img;
String image = cursor.getString(columnIndex).trim();
try {
resourceId = R.drawable.class.getField(image).getInt(null);
} catch (NoSuchFieldException e) {
}
((ImageView) view).setImageResource(resourceId);
binded = true;
}
return binded;
}
});
Одна из особенностей метода setViewValue заключается в том, что если он возвращает false, то SimpleCursorAdapter будет выполнять привязку, как обычно. Но если этот метод возвращает true, SimpleCursorAdapter считает выполненную работу и больше не пытается привязывать это поле.
Я только начинаю с программирования на Android. Я сделал что-то подобное в одном проекте, и он работал нормально. Я не знаю, есть ли более простой способ.
С наилучшими пожеланиями.
Вам нужно написать свой собственный адаптер, который расширяет SimpleCursorAdapter, а затем переопределить метод getView, чтобы установить изображения для вашего текстового представления как coumpund-drawable.
Ниже приведен только пример, но вы можете использовать его по-своему:
private class NotesListAdapter extends ArrayAdapter<Note>{
public NotesListAdapter() {
super(getBaseContext(), R.layout.list_note_row, R.id.noteHead, notes);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if(convertView == null){
LayoutInflater inflater = getLayoutInflater();
convertView = inflater.inflate(R.layout.list_note_row, parent, false);
holder = new ViewHolder();
holder.txtHeading = ((TextView)convertView.findViewById(R.id.noteHead));
holder.txtContent = ((TextView)convertView.findViewById(R.id.noteBody));
holder.image = ((ImageView)convertView.findViewById(R.id.note_icon));
convertView.setTag(holder);
}
else
holder = (ViewHolder) convertView.getTag();
//set texts
holder.txtHeading.setText("bla bla");
holder.txtHeading.setCompoundDrawables(getResources().getDrawable(R.drawable.app_icon), null, null, null);
holder.txtContent.setText("bla bla");
return convertView;
}
}
//this is better approach as suggested by Google-IO for ListView
static class ViewHolder{
TextView txtHeading;
TextView txtContent;
ImageView image;
}