Сортировка выборки и обновление ListView
Сортировка выборки и обновление ListView
В приложении используется список и адаптер для вывода данных в список из базы. Хочу сделать вывод отсортированных данных по разным полям при нажатии на кнопки, для этого сделал пару кнопок при нажатии на которые вызываю метод который возвращает курсор на отсортированные данные. Но вот проблема: в списке на экране данные при этом не видно что отсортированы. Что делаю не так?
Re: Сортировка выборки и обновление ListView
Код в студию!jBee писал(а):В приложении используется список и адаптер для вывода данных в список из базы. Хочу сделать вывод отсортированных данных по разным полям при нажатии на кнопки, для этого сделал пару кнопок при нажатии на которые вызываю метод который возвращает курсор на отсортированные данные. Но вот проблема: в списке на экране данные при этом не видно что отсортированы. Что делаю не так?
Re: Сортировка выборки и обновление ListView
Послать адаптеру notify
R.id.team
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Сортировка выборки и обновление ListView
Мое чутье подсказывает, это не поможет.Olivka писал(а):Послать адаптеру notify
Приведите часть кода в которой вы получаете отсортированные данные и выводите их на экран.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Сортировка выборки и обновление ListView
Все вроды бы довольно просто:
Находим кнопки, присваиваем им обработчик, тут все просто.
Код получения курсора, адаптера
[syntax=java5] cursor = dbHelper.getAllRecords();
String[] columns = new String[] {"col1", "col2", "col3"};
int[] to = new int[] { R.id.tv1, R.id.tv2, R.id.tv3};
dataAdapter = new MyCursorAdapter(this, R.layout.list_item1,
cursor, columns, to, 0);
listView = (ListView) findViewById(R.id.listView1);
// Assign adapter to ListView
listView.setAdapter(dataAdapter);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);[/syntax]
Далее в обработчике нажатия кнопок код для получения отсортированных данных:
[syntax=java5]
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnSortCol1:
cursor = dbHelper.fetchSortOrdersByCol1();
dataAdapter.notifyDataSetChanged();
break;
case
...
break;
}
}
[/syntax]
fetchSortOrdersByCol1(); делает запрос такой же как в getAllRecords() но с добавлением сортировки order by col1 и возвращает курсор, который мы и присваиваем глобальной переменной cursor т.е. так:
[syntax=java5]public Cursor fetchSortOrdersByCol1() {
Cursor mCursor = null;
mCursor = mDb.rawQuery("select * from tab1 order by col1 desc", null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}[/syntax]
Находим кнопки, присваиваем им обработчик, тут все просто.
Код получения курсора, адаптера
[syntax=java5] cursor = dbHelper.getAllRecords();
String[] columns = new String[] {"col1", "col2", "col3"};
int[] to = new int[] { R.id.tv1, R.id.tv2, R.id.tv3};
dataAdapter = new MyCursorAdapter(this, R.layout.list_item1,
cursor, columns, to, 0);
listView = (ListView) findViewById(R.id.listView1);
// Assign adapter to ListView
listView.setAdapter(dataAdapter);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);[/syntax]
Далее в обработчике нажатия кнопок код для получения отсортированных данных:
[syntax=java5]
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnSortCol1:
cursor = dbHelper.fetchSortOrdersByCol1();
dataAdapter.notifyDataSetChanged();
break;
case
...
break;
}
}
[/syntax]
fetchSortOrdersByCol1(); делает запрос такой же как в getAllRecords() но с добавлением сортировки order by col1 и возвращает курсор, который мы и присваиваем глобальной переменной cursor т.е. так:
[syntax=java5]public Cursor fetchSortOrdersByCol1() {
Cursor mCursor = null;
mCursor = mDb.rawQuery("select * from tab1 order by col1 desc", null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}[/syntax]
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Сортировка выборки и обновление ListView
Я так и думал. В переменную cursor Вы записываете ссылку на новый курсор, в то время как адаптер все еще хранит ссылку на старый курсор.
Если Вы используете SimpleCursorAdapter, Вам необходимо сделать следующее:
[syntax=java]mAdapter.swapCursor(mCursor).close();[/syntax]
Если Вы используете SimpleCursorAdapter, Вам необходимо сделать следующее:
[syntax=java]mAdapter.swapCursor(mCursor).close();[/syntax]
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Сортировка выборки и обновление ListView
KamiSempai,
спасибо за подсказку
Действительно, swapCursor помог - список стал показывать отсортированный набор, я сделал так как Вы сказали но без close() (с ним получаю NullPointerException)
меняем код в обработчике кнопки вызова сортировки:
[syntax=java5]
...
dataAdapter.swapCursor(dbHelper.fetchSortOrdersByCol1());
dataAdapter.notifyDataSetChanged();
...
[/syntax]
напомню что dbHelper.fetchSortOrdersByCol1() - возвращает курсор на отсортированный набор данных
спасибо за подсказку
Действительно, swapCursor помог - список стал показывать отсортированный набор, я сделал так как Вы сказали но без close() (с ним получаю NullPointerException)
меняем код в обработчике кнопки вызова сортировки:
[syntax=java5]
...
dataAdapter.swapCursor(dbHelper.fetchSortOrdersByCol1());
dataAdapter.notifyDataSetChanged();
...
[/syntax]
напомню что dbHelper.fetchSortOrdersByCol1() - возвращает курсор на отсортированный набор данных
Re: Сортировка выборки и обновление ListView
А как быть после того как изменена только одна запись в базе. Т.е. например выделил запись в списке, получил id этой записи в базе данных, изменил значения записи в базе через update. Теперь надо бы чтобы эти изменения отобразились в элементе списка, и это работает если сделать снова выборку через dataAdapter.swapCursor(dbHelper.fetchAllOrders()); где fetchAllOrders() возвращает курсор на выборку всех записей из базы. Но при этом обновленная запись может попасть за границы экрана и ее приходится искать промоткой списка.
Как сделать чтобы изменения данных отображались в элементе списка без выборки из базы всех данных заново?
Как сделать чтобы изменения данных отображались в элементе списка без выборки из базы всех данных заново?
Re: Сортировка выборки и обновление ListView
Писать ContentProvider и работать с базой через него.