Страница 1 из 1

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

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

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

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

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

Добавлено: 24 апр 2013, 10:35
Foenix
Послать адаптеру notify

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

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

Приведите часть кода в которой вы получаете отсортированные данные и выводите их на экран.

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

Добавлено: 24 апр 2013, 11:48
jBee
Все вроды бы довольно просто:

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

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

[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]

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

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

[syntax=java]mAdapter.swapCursor(mCursor).close();[/syntax]

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

Добавлено: 24 апр 2013, 13:32
jBee
KamiSempai,

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

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

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

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

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

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

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

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

Добавлено: 24 апр 2013, 16:09
neoksi
Писать ContentProvider и работать с базой через него.