Как добавить изображение из Drawable в ListView заполнить из базы данных - PullRequest
0 голосов
/ 09 февраля 2012

Мне интересно, как добавить изображения из drawables в мой список.У меня есть ListView с двумя TextViews (идентификатор, активность), которые я получаю из базы данных.Не могли бы вы дать мне какой-нибудь совет?Привет

Ответы [ 2 ]

2 голосов
/ 09 июня 2012

Если я правильно понял ваш вопрос, одним из решений было бы включить 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.Я сделал что-то подобное в одном проекте, и он работал нормально.Я не знаю, есть ли более простой способ.

С уважением.

2 голосов
/ 09 февраля 2012

вам нужно написать свой собственный адаптер, который расширяет SimpleCursorAdapter, а затем переопределить метод getView, чтобы установить изображения для вашего textview как 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;
    }
...