Имею ListView с кастомным адаптером от ArrayAdapter, где каждый элемент — это объект с несколькими свойствами. Данные в ListView подгружаются из сети периодически с заданным интервалом. Необходимо реализовать включаемый/отключаемый фильтр по двум числовым значениям внутри объекта.
Для реализации этого я создал свой фильтр внутри адаптера. Но такой подход работает не совсем так, как хотелось бы. Во-первых, судя по всему он изменяет содержимое адаптера, во-вторых, не учитывает свежедобавленные данные. А хотелось бы иметь фильтр, который просто скрывает неподходящие под условие строки при включении, никак не влияя на истинное содержимое ListView. Тем не менее, мне не удалось найти методов для скрытия отдельных строк. Существуют ли встроенные средства для реализации подобного? Если нет, то как лучше реализовать это?
1. Не нужно засовывать в адаптер то, что не должно быть показано.
2. Даже, если и засовывать, фильтр должен помочь, так что разбирайтесь с фильтром, может в коде что то не правильно.
Ну да, после обновления в данный момент не применяю, каюсь. Добавлю. Но тут проблема несколько в другом: фильтр изменяет содержимое адаптера (переменная tracks в указанном примере). Видимо, поэтому автор статьи и сохраняет отдельно оригинальный список в переменную original перед фильтрацией. А при таком раскладе несовсем понятно, как реализовать мою задачу.
У вас два списка: оригинальный и фильтрованный. Каждый раз берем оригинальные данные, фильтруем, дальше новый список сетим в адаптер, адаптер об этом не забываем уведомлять.
Если что то не фильтруется, значит что то в вашем коде работает не правильно. Тут уже проверяйте что не так вы делаете, и почему на выходе список не такой, для этого есть дебаг или можно вывести содержимое списков в логкат.
Сорри, я плохо объясняю. Тут как: есть список, который постоянно дополняется данными из сети. То есть именно дополняется, а не обновляется целиком. У списка понятное дело есть адаптер, внутри которого все это собственно и хранится. Но стоит приложить к нему фильтр, как содержимое адаптера сразу изменяется на отфильтрованное (нет бы просто скрыть неподходящие строки). Поэтому я и спрашивал нет ли какого-нибудь встроенного механизма скрывающего неугодные фильтру строки, но не изменяющие содержимое адаптера. В принципе, для решения можно добавлять данные в сторонний ArrayList, а потом каждый раз с нуля заполнять ListView им, включая фильтр. Просто кажется это достаточно громоздким, вот и хотелось что-то поизящнее.
Ну и пусть будет отфильтрованным, вам же это и нужно. Если понадобится как то по другому отобразить, просто заново вызовите фильтр с нужными опциями. А оригинальный список, просто хранится, что бы с него в любой момент можно было создать нужную копию списка, его не нужно на прямую сетить в адаптер.
Ну не просто: при включенном фильтре придется очищать ListView, заново заполнять его всеми записями и вызывать фильтр при каждом добавлении записей… Ну ладно, подход вроде понятен, спасибо за помощь.
Ну не просто: при включенном фильтре придется очищать ListView, заново заполнять его всеми записями и вызывать фильтр при каждом добавлении записей… Ну ладно, подход вроде понятен, спасибо за помощь.
Листвью ничего сложного не делает, он обновит только видимые на экране записи. Адаптеру тоже все равно. А заполнение нового списка, должно быть вообще очень быстро, ведь новые объекты не создаются.
А фильтром пользователь пользуется, или для чего он вообще нужен?
Хм, звучит и правда неплохо :) А фильтр убирает записи, которые имеют опреленный флаг. То есть если пользователь отметил checkable пункт меню — фильтр включен, если снял галочку — показываем все записи.