У меня есть listview, который загружает данные из базы данных sqlite. Каждая строка в списке имеет изображение, текст и флажок. Строки sqlitedatabase содержат изображения и текстовые данные + некоторые другие столбцы.
Мой вопрос: могу ли я связать свой список с базой данных, чтобы все строки были загружены с необходимыми данными автоматически. (image + textview) Есть примеры для привязки простого списка текстовых просмотров. Что относительно сложных строк? Кроме того, есть несколько прядильщиков, которые могут фильтровать данные в списке в зависимости от его значения. (Которые действуют как предложение WHERE в моей БД)
В настоящее время я управляю всем этим, создавая представление для моего пользовательского адаптера для каждой строки. Поэтому каждый раз я запрашиваю базу данных и заполняю данные. Я держу последние результаты списка, создаю более новые результаты на основе действий/условий, таких как значения spinner, а затем notifydatachanged для адаптера для загрузки моих новых результатов.
Чтобы добавить такие функции, как DELETE, ADD, SEARCH - мне нужно управлять всем этим с помощью коллекций.
Есть ли простой способ сделать это? Как если бы db был большим, то подход сдерживания такого огромного набора результатов в памяти не очень хорош. И это больно для управления им. Спасибо.
Вот мой пример для строки, построенный из двух записей из 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>
Мой вопрос: могу ли я связать свой список с базой данных, чтобы все строки будут загружены требуемые данные автоматически. (изображение + текстовое изображение) Есть примеры, чтобы связать простой список текстовых просмотров. Что относительно сложного строки?
Да, вы можете сделать Cursor
сложное отображение вида, реализовав свой собственный CursorAdapter
и переопределив bindView()
.
CursorAdapter
; Вы можете добавить ViewBinder
для достижения более или менее того же эффекта, что и переопределение bindView
. У меня есть недавнее сообщение в блоге, которое включает в себя образец ViewBinder. (В примере используются Spinner
и SimpleAdapter
, но метод должен работать с ListView
и SimpleCursorAdapter
.) См. Outofwhatbox.com/blog/2010/12/…