Сортировка выборки и обновление ListView

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
jBee
Сообщения: 41
Зарегистрирован: 03 апр 2013, 16:24

Сортировка выборки и обновление ListView

Сообщение jBee » 24 апр 2013, 10:28

В приложении используется список и адаптер для вывода данных в список из базы. Хочу сделать вывод отсортированных данных по разным полям при нажатии на кнопки, для этого сделал пару кнопок при нажатии на которые вызываю метод который возвращает курсор на отсортированные данные. Но вот проблема: в списке на экране данные при этом не видно что отсортированы. Что делаю не так?

Tamachi
Сообщения: 203
Зарегистрирован: 17 апр 2013, 00:08

Re: Сортировка выборки и обновление ListView

Сообщение Tamachi » 24 апр 2013, 10:31

jBee писал(а):В приложении используется список и адаптер для вывода данных в список из базы. Хочу сделать вывод отсортированных данных по разным полям при нажатии на кнопки, для этого сделал пару кнопок при нажатии на которые вызываю метод который возвращает курсор на отсортированные данные. Но вот проблема: в списке на экране данные при этом не видно что отсортированы. Что делаю не так?
Код в студию!

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Сортировка выборки и обновление ListView

Сообщение Foenix » 24 апр 2013, 10:35

Послать адаптеру notify
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Сортировка выборки и обновление ListView

Сообщение KamiSempai » 24 апр 2013, 10:57

Olivka писал(а):Послать адаптеру notify
Мое чутье подсказывает, это не поможет.

Приведите часть кода в которой вы получаете отсортированные данные и выводите их на экран.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

jBee
Сообщения: 41
Зарегистрирован: 03 апр 2013, 16:24

Re: Сортировка выборки и обновление ListView

Сообщение jBee » 24 апр 2013, 11:48

Все вроды бы довольно просто:

Находим кнопки, присваиваем им обработчик, тут все просто.

Код получения курсора, адаптера

[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

Сообщение KamiSempai » 24 апр 2013, 12:06

Я так и думал. В переменную cursor Вы записываете ссылку на новый курсор, в то время как адаптер все еще хранит ссылку на старый курсор.
Если Вы используете SimpleCursorAdapter, Вам необходимо сделать следующее:

[syntax=java]mAdapter.swapCursor(mCursor).close();[/syntax]
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

jBee
Сообщения: 41
Зарегистрирован: 03 апр 2013, 16:24

Re: Сортировка выборки и обновление ListView

Сообщение jBee » 24 апр 2013, 13:32

KamiSempai,

спасибо за подсказку :)

Действительно, swapCursor помог - список стал показывать отсортированный набор, я сделал так как Вы сказали но без close() (с ним получаю NullPointerException)

меняем код в обработчике кнопки вызова сортировки:
[syntax=java5]
...
dataAdapter.swapCursor(dbHelper.fetchSortOrdersByCol1());
dataAdapter.notifyDataSetChanged();
...
[/syntax]

напомню что dbHelper.fetchSortOrdersByCol1() - возвращает курсор на отсортированный набор данных

jBee
Сообщения: 41
Зарегистрирован: 03 апр 2013, 16:24

Re: Сортировка выборки и обновление ListView

Сообщение jBee » 24 апр 2013, 16:00

А как быть после того как изменена только одна запись в базе. Т.е. например выделил запись в списке, получил id этой записи в базе данных, изменил значения записи в базе через update. Теперь надо бы чтобы эти изменения отобразились в элементе списка, и это работает если сделать снова выборку через dataAdapter.swapCursor(dbHelper.fetchAllOrders()); где fetchAllOrders() возвращает курсор на выборку всех записей из базы. Но при этом обновленная запись может попасть за границы экрана и ее приходится искать промоткой списка.

Как сделать чтобы изменения данных отображались в элементе списка без выборки из базы всех данных заново?

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Сортировка выборки и обновление ListView

Сообщение neoksi » 24 апр 2013, 16:09

Писать ContentProvider и работать с базой через него.

Ответить