фильтрация данных в ListView

Интерфейс, диалоги, темы, стили, меню
Ответить
Wa1deMar
Сообщения: 14
Зарегистрирован: 01 авг 2012, 11:19

фильтрация данных в ListView

Сообщение Wa1deMar » 29 ноя 2012, 17:37

Такое задание есть - с базы заполняется ListView (иконка, название, автор, цена). есть 3 кнопки - платные, бесплатные, все. как сделать чтобы при выборе конкретной кнопки отображались только те товары которые подходят по критериям. если можна, то дайте небольшой примерчик.

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

Re: фильтрация данных в ListView

Сообщение Foenix » 29 ноя 2012, 19:24

у меня примера нету, но я бы делала примерно так
Когда вы "из базы" получаете запросом курсор, и на его основе строите список, то при нажатии кнопки - нужно пересоздавать тот же самый курсор, только запрос в базу будет другой по бесплатным позициям, и так далее.
По-другому вам список не отфильтровать.
R.id.team

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: фильтрация данных в ListView

Сообщение rezak90 » 29 ноя 2012, 21:59

Olivka, можно отфильтровать... http://developer.android.com/reference/ ... ilter.html
Класс Filter для этого спец и создан. Извините за примером в гугл так как тема не лёгкая и писать пример нужно не мало времени, а я только домой добрался =)
R.id.team
Политика на форуме запрещена

gad007
Сообщения: 10
Зарегистрирован: 06 фев 2013, 20:47

Re: фильтрация данных в ListView

Сообщение gad007 » 19 фев 2013, 18:24

я думаю многим бы было интересно посмотреть хоть небольшой примерчик реализации фильтра. спасибо.

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

Re: фильтрация данных в ListView

Сообщение Foenix » 19 фев 2013, 19:42

gad007 писал(а):я думаю многим бы было интересно посмотреть хоть небольшой примерчик реализации фильтра. спасибо.
я сделала сама довольно быстро. Сайт stackoverflow.com просто полон примерами такого рода, можно сказать самостоятельно довольно редко приходится хоть что-то писать.
R.id.team

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

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

Re: фильтрация данных в ListView

Сообщение Foenix » 19 фев 2013, 19:43

rezak90 писал(а):Olivka, можно отфильтровать... http://developer.android.com/reference/ ... ilter.html
Класс Filter для этого спец и создан. Извините за примером в гугл так как тема не лёгкая и писать пример нужно не мало времени, а я только домой добрался =)
да тема оказалась вовсе не такой уж сложной)
R.id.team

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

Zeban
Сообщения: 26
Зарегистрирован: 30 окт 2013, 06:46
Откуда: Благовещенск

Re: фильтрация данных в ListView

Сообщение Zeban » 04 май 2014, 18:08

Помогите пожалуйста настроить фильтр. Никак не получается( У меня поиск осуществляется через 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("Текст условие") мне не поможет. Нужно менять запрос в курсоре? Только вот где не пойму. :|

Zeban
Сообщения: 26
Зарегистрирован: 30 окт 2013, 06:46
Откуда: Благовещенск

Re: фильтрация данных в ListView

Сообщение Zeban » 06 май 2014, 15:43

Кому если надо сделал так:

Код: Выделить всё

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;
    }

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

Re: фильтрация данных в ListView

Сообщение Foenix » 06 май 2014, 16:42

маааленькое пожелание
чтоб был читаемый код, можно оформить позиции вашего спиннера как константы со звучным именем
final int FILTER_ALL=0;
final int FILTER_GOOD=1;
и в зависимости от выбранной позиции назначать переменной pos (у вас pos) значение одно или другео. Далее в операторе switch уже перебирать не безликие 0 или 1, а именами констант
switch (pos){
case FILTER_ALL:
...




и еще, если это уместно, но я обычно оформляю такие методы как у вас getAllData и getModKrepData - если они к одному набору данных, конечно же (к одним и тем же таблицам) в один метод, только на вход посылаю значение фильтра. Таким образом можно даже этот switch опустить. Да и еще кое-где подсократить код, не теряя читаемости.
R.id.team

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

Zeban
Сообщения: 26
Зарегистрирован: 30 окт 2013, 06:46
Откуда: Благовещенск

Re: фильтрация данных в ListView

Сообщение Zeban » 07 май 2014, 05:12

Foenix спасибо за хорошие поправки, постараюсь их использовать. Я еще сам мало такие вещи замечаю, из за малого опыта.

Zeban
Сообщения: 26
Зарегистрирован: 30 окт 2013, 06:46
Откуда: Благовещенск

Re: фильтрация данных в ListView

Сообщение Zeban » 09 май 2014, 16:59

Сделал так

Код: Выделить всё

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);
    }

Ответить