Связывание строки списка просмотра с базой данных sqlite для пользовательских строк

1

У меня есть listview, который загружает данные из базы данных sqlite. Каждая строка в списке имеет изображение, текст и флажок. Строки sqlitedatabase содержат изображения и текстовые данные + некоторые другие столбцы.

Мой вопрос: могу ли я связать свой список с базой данных, чтобы все строки были загружены с необходимыми данными автоматически. (image + textview) Есть примеры для привязки простого списка текстовых просмотров. Что относительно сложных строк? Кроме того, есть несколько прядильщиков, которые могут фильтровать данные в списке в зависимости от его значения. (Которые действуют как предложение WHERE в моей БД)

В настоящее время я управляю всем этим, создавая представление для моего пользовательского адаптера для каждой строки. Поэтому каждый раз я запрашиваю базу данных и заполняю данные. Я держу последние результаты списка, создаю более новые результаты на основе действий/условий, таких как значения spinner, а затем notifydatachanged для адаптера для загрузки моих новых результатов.

Чтобы добавить такие функции, как DELETE, ADD, SEARCH - мне нужно управлять всем этим с помощью коллекций.

Есть ли простой способ сделать это? Как если бы db был большим, то подход сдерживания такого огромного набора результатов в памяти не очень хорош. И это больно для управления им. Спасибо.

  • 0
    И если упомянуть проблему, если вы добавите флажок в строке списка, вы не получите событие щелчка по элементам списка. Вы должны добавить слушателя к отдельным представлениям в строке. Так как же получить обычный клик по элементу списка?
Теги:
database
binding
listview

2 ответа

2
Лучший ответ

Вот мой пример для строки, построенный из двух записей из db + image (по текущему - одно изображение для любой строки, но его можно улучшить для определенного изображения из db):

    public class DomainAdapter extends SimpleCursorAdapter{
    private Cursor dataCursor;

    private LayoutInflater mInflater;
    ....

    public DomainAdapter(Context context, int layout, Cursor dataCursor, String[] from,
            int[] to) {
        super(context, layout, dataCursor, from, to);
            this.dataCursor = dataCursor;
            mInflater = LayoutInflater.from(context);
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        // A ViewHolder keeps references to children views to avoid unneccessary calls
        // to findViewById() on each row.
        ViewHolder holder;

        // When convertView is not null, we can reuse it directly, there is no need
        // to reinflate it. We only inflate a new View when the convertView supplied
        // by ListView is null.
        if (convertView == null) {
            convertView = mInflater.inflate(layout, null);

            // Creates a ViewHolder and store references to the two children views
            // we want to bind data to.
            holder = new ViewHolder();
            holder.text1 = (TextView) convertView.findViewById(R.id.test_track);
            holder.text2 = (TextView) convertView.findViewById(R.id.test_band);
            holder.icon = (ImageView) convertView.findViewById(R.id.test_artwork);

            convertView.setTag(holder);
        } else {
            // Get the ViewHolder back to get fast access to the TextView
            // and the ImageView.
            holder = (ViewHolder) convertView.getTag();
        }

        // Bind the data efficiently with the holder.
        // Cursor to current item
        dataCursor.moveToPosition(position);
        int title_index = dataCursor.getColumnIndex(fields[0]); 
        String title = dataCursor.getString(title_index);

        int description_index = dataCursor.getColumnIndex(fields[1]); 
        String description = dataCursor.getString(description_index);

        holder.text1.setText(title);
        holder.text2.setText(description);
        holder.icon.setImageResource(R.drawable.alert_dialog_icon);

        return convertView;
    }

    static class ViewHolder {
        TextView text1;
        TextView text2;
        ImageView icon;
    }
}

и используя этот адаптер:

databaseListAdapter = new DomainAdapter(this, 
                R.layout.test_layout, 
                databaseCursor, 
                new String[] {"title", "description"}, 
                new int[] { R.id.test_track, R.id.test_track });
databaseListAdapter.notifyDataSetChanged();
DomainView.setAdapter(databaseListAdapter);

и макет:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="64dip"
    android:padding="6dip">

    <TextView
        android:id="@+id/test_band"  
        android:layout_width="fill_parent" 
        android:layout_height="26dip" 

        android:layout_below="@+id/test_track"
        android:layout_alignLeft="@id/test_track"
        android:layout_alignParentBottom="true"

        android:gravity="top" />

    <TextView
        android:id="@id/test_track"  
        android:layout_marginLeft="6dip"
        android:layout_width="fill_parent"
        android:layout_height="26dip"

        android:layout_toRightOf="@+id/test_artwork"

        android:textAppearance="?android:attr/textAppearanceMedium"
        android:gravity="bottom" />

    <ImageView
        android:id="@id/test_artwork"
        android:layout_width="56dip"
        android:layout_height="56dip"
        android:layout_gravity="center_vertical" />

</RelativeLayout>
  • 0
    Привет, вы можете расширить дальше на своем примере. Я не уверен, как использовать «данные». переменная. Thnx!
  • 0
    Мне очень жаль! Когда я написал этот код, я переименовал некоторые переменные. Данные - это Курсор. Я исправил ошибки, спасибо за вопрос.
Показать ещё 2 комментария
0

Мой вопрос: могу ли я связать свой список с базой данных, чтобы все строки будут загружены требуемые данные автоматически. (изображение + текстовое изображение) Есть примеры, чтобы связать простой список текстовых просмотров. Что относительно сложного строки?

Да, вы можете сделать Cursor сложное отображение вида, реализовав свой собственный CursorAdapter и переопределив bindView().

  • 0
    Нет необходимости расширять CursorAdapter ; Вы можете добавить ViewBinder для достижения более или менее того же эффекта, что и переопределение bindView . У меня есть недавнее сообщение в блоге, которое включает в себя образец ViewBinder. (В примере используются Spinner и SimpleAdapter , но метод должен работать с ListView и SimpleCursorAdapter .) См. Outofwhatbox.com/blog/2010/12/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню