Страница 1 из 1
фильтрация данных в ListView
Добавлено: 29 ноя 2012, 17:37
Wa1deMar
Такое задание есть - с базы заполняется ListView (иконка, название, автор, цена). есть 3 кнопки - платные, бесплатные, все. как сделать чтобы при выборе конкретной кнопки отображались только те товары которые подходят по критериям. если можна, то дайте небольшой примерчик.
Re: фильтрация данных в ListView
Добавлено: 29 ноя 2012, 19:24
Foenix
у меня примера нету, но я бы делала примерно так
Когда вы "из базы" получаете запросом курсор, и на его основе строите список, то при нажатии кнопки - нужно пересоздавать тот же самый курсор, только запрос в базу будет другой по бесплатным позициям, и так далее.
По-другому вам список не отфильтровать.
Re: фильтрация данных в ListView
Добавлено: 29 ноя 2012, 21:59
rezak90
Olivka, можно отфильтровать...
http://developer.android.com/reference/ ... ilter.html
Класс Filter для этого спец и создан. Извините за примером в гугл так как тема не лёгкая и писать пример нужно не мало времени, а я только домой добрался =)
Re: фильтрация данных в ListView
Добавлено: 19 фев 2013, 18:24
gad007
я думаю многим бы было интересно посмотреть хоть небольшой примерчик реализации фильтра. спасибо.
Re: фильтрация данных в ListView
Добавлено: 19 фев 2013, 19:42
Foenix
gad007 писал(а):я думаю многим бы было интересно посмотреть хоть небольшой примерчик реализации фильтра. спасибо.
я сделала сама довольно быстро. Сайт stackoverflow.com просто полон примерами такого рода, можно сказать самостоятельно довольно редко приходится хоть что-то писать.
Re: фильтрация данных в ListView
Добавлено: 19 фев 2013, 19:43
Foenix
да тема оказалась вовсе не такой уж сложной)
Re: фильтрация данных в ListView
Добавлено: 04 май 2014, 18:08
Zeban
Помогите пожалуйста настроить фильтр. Никак не получается( У меня поиск осуществляется через spinner. Пользователь выбирает нужный параметр фильтрации и ListView обновляется.
Вот код:
Код: Выделить всё
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.modification);
// адаптер
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, data);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner = (Spinner) findViewById(R.id.spin_mod);
spinner.setAdapter(adapter);
spinner.setPrompt("Title");
spinner.setSelection(0);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
//Сюда, я так понял, надо вставить, что то вроде: scAdapter.getFilter().filter("Текст условие");
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
// открываем подключение к БД
db = new DayzDB(this);
db.openDataBase();
// формируем столбцы сопоставления
String[] from = new String[] { DayzDB.COLUMN_MENU_NAME, DayzDB.COLUMN_MENU_IMG };
int[] to = new int[] { R.id.list_name, R.id.list_img };
// создааем адаптер и настраиваем список
scAdapter = new MySimpleCursorAdapter(this, R.layout.list, null, from, to, 0);
lvData = (ListView) findViewById(R.id.lvmod);
lvData.setAdapter(scAdapter);
// создаем лоадер для чтения данных
getSupportLoaderManager().initLoader(0, null, this);
}
protected void onDestroy() {
super.onDestroy();
db.close();
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
return new MyCursorLoader(this, db);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
scAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
static class MyCursorLoader extends CursorLoader {
DayzDB db;
public MyCursorLoader(Context context, DayzDB db) {
super(context);
this.db = db;
}
@Override
public Cursor loadInBackground() {
Cursor cursor = null;
cursor = db.getModData();
return cursor;
}
Фильтровать надо по столбцу который в ListView не отображается, но есть в базе. Я так понимаю scAdapter.getFilter().filter("Текст условие") мне не поможет. Нужно менять запрос в курсоре? Только вот где не пойму.

Re: фильтрация данных в ListView
Добавлено: 06 май 2014, 15:43
Zeban
Кому если надо сделал так:
Код: Выделить всё
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
pos = position;
getSupportLoaderManager().getLoader(0).forceLoad();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
Код: Выделить всё
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
return new MyCursorLoader(this, db, pos);
}
Код: Выделить всё
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
static class MyCursorLoader extends CursorLoader {
DayzDB db;
public MyCursorLoader(Context context, DayzDB db, int pos) {
super(context);
this.db = db;
}
@Override
public Cursor loadInBackground() {
Cursor cursor = null;
switch (pos){
case 0:
cursor = db.getAllData();
break;
case 1:
cursor = db.getModKrepData();
break;
}
return cursor;
}
Re: фильтрация данных в ListView
Добавлено: 06 май 2014, 16:42
Foenix
маааленькое пожелание
чтоб был читаемый код, можно оформить позиции вашего спиннера как константы со звучным именем
final int FILTER_ALL=0;
final int FILTER_GOOD=1;
и в зависимости от выбранной позиции назначать переменной pos (у вас pos) значение одно или другео. Далее в операторе switch уже перебирать не безликие 0 или 1, а именами констант
switch (pos){
case FILTER_ALL:
...
и еще, если это уместно, но я обычно оформляю такие методы как у вас getAllData и getModKrepData - если они к одному набору данных, конечно же (к одним и тем же таблицам) в один метод, только на вход посылаю значение фильтра. Таким образом можно даже этот switch опустить. Да и еще кое-где подсократить код, не теряя читаемости.
Re: фильтрация данных в ListView
Добавлено: 07 май 2014, 05:12
Zeban
Foenix спасибо за хорошие поправки, постараюсь их использовать. Я еще сам мало такие вещи замечаю, из за малого опыта.
Re: фильтрация данных в ListView
Добавлено: 09 май 2014, 16:59
Zeban
Сделал так
Код: Выделить всё
public class ModActivity extends FragmentActivity implements LoaderCallbacks<Cursor> {
ListView lvData;
DayzDB db;
SimpleCursorAdapter scAdapter;
String[] data = {"Все", "Категория1", "Категория2", "Категория3", "Категория4", "Категория5", "Категория6", "Категория7", "Категория8", "Категория9"};
Spinner spinner;
static String pos1 = "Раздел", pos2 = "";
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.modification);
// адаптер
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, data);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner = (Spinner) findViewById(R.id.spin_mod);
spinner.setAdapter(adapter);
// заголовок
spinner.setPrompt("Title");
// выделяем элемент
spinner.setSelection(0);
// устанавливаем обработчик нажатия
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// показываем позиция нажатого элемента
if (position == 0)
pos2 = "%";
else
pos2 = data[position];
getSupportLoaderManager().getLoader(0).forceLoad();
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
});
// открываем подключение к БД
db = new DayzDB(this);
db.openDataBase();
// формируем столбцы сопоставления
String[] from = new String[] { DayzDB.COLUMN_MENU_NAME, DayzDB.COLUMN_MENU_IMG };
int[] to = new int[] { R.id.list_name, R.id.list_img };
// создааем адаптер и настраиваем список
scAdapter = new MySimpleCursorAdapter(this, R.layout.list, null, from, to, 0);
lvData = (ListView) findViewById(R.id.lvmod);
lvData.setAdapter(scAdapter);
// создаем лоадер для чтения данных
getSupportLoaderManager().initLoader(0, null, this);
}
protected void onDestroy() {
super.onDestroy();
// закрываем подключение при выходе
db.close();
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
return new MyCursorLoader(this, db, pos1, pos2);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
scAdapter.swapCursor(cursor);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
}
static class MyCursorLoader extends CursorLoader {
DayzDB db;
public MyCursorLoader(Context context, DayzDB db, String pos1, String pos2) {
super(context);
this.db = db;
}
@Override
public Cursor loadInBackground() {
Cursor cursor = db.getBaseData(pos1, pos2);
return cursor;
}
}
}
И метод выборки:
Код: Выделить всё
public Cursor getBaseData(String pos1, String pos2) {
String query = "SELECT * FROM " + DB_MENU_AP + " WHERE " + COLUMN_MENU_TYPE + " LIKE '" + pos1 + pos2 + "'";
return myDataBaseDZ.rawQuery(query, null);
}