我目前正在编写一个应用程序,它从数据库中获取数据并填充一个数组,该数组在整个应用程序的多个位置用于在Card View和Map中显示数据。
public class Filter {
public ArrayList<Event> eventsList;
public Filter() {
}
public void setEvents(ArrayList events) {
this.eventsList = events;
}
public ArrayList getEvents() {
return eventsList;
}
}
但是,我需要能够允许用户过滤该数据,因为它当前从数据库返回所有内容。我没有问题会过滤数据,但我希望能够做的是删除过滤器但不影响可能选择的任何其他过滤器。
因此,例如,如果有人按位置和日期过滤我希望能够删除其中一个过滤器,但另一个仍然适用,如果我删除它们,那么数据集将返回其默认的“全部获取”值。 / p>
我目前对如何解决这个问题感到茫然。有没有一种简单的方法可以添加和删除过滤器并让应用程序中的所有内容更新而没有任何问题?
对这个问题不以为然。非常感谢。
答案 0 :(得分:1)
我会遵循这种方法:
创建一个Filter接口,所有过滤器都将扩展:
public interface Filter {
public boolean filter(Event event);
}
然后扩展一个适配器,它将存储过滤器。
public class FilterableAdapter extends BaseAdapter {
private List<Filter> _filters = new ArrayList<Filter>();
private List<Event> _items = null;
private List<Event> _filteredItems = new ArrayList<Filter>();
public void addFilter(Filter filter) {
_filters.add(filter);
_filterItems();
}
public void removeFilter(Filter filter) {
_filters.remove(filter);
_filterItems();
}
public List<Filter> getFilters() {
return _filters;
}
public void setItems(List<Event> items) {
_items = items;
_filterItems();
}
private void _filterItems() {
_filteredItems.clear();
for (Filter filter : _filters) {
for (Event event : _items) {
if (filter.filter(event)) {
_filteredItems.add(event);
}
}
}
notifyDataSetChanged();
}
@Override
public void getItem(int position) {
return _filteredItems.get(position);
}
@Override
public void getCount() {
return _filteredItems.size();
}
}
然后您创建不同的过滤器,例如:
public class BigEventFilter implements Filter {
@Override
public boolean filter(Event event) {
return event.getAttendeeCount() > 100;
}
}
或带参数的人:
public class NiceCityFilter implements Filter {
private String _cityName;
public NiceCityFilter(String cityName) {
_cityName = cityName;
}
@Override
public boolean filter(Event event) {
return cityName.equals(event.getCity());
}
}
然后您可以添加它们或从适配器中删除它们:
eventAdapter.addFilter(new BigEventFilter());
eventAdapter.addFilter(new NiceCityFilter("Budapest"));
eventAdapter.removeFilter(eventAdapter.getFilters().get(0));
可能你会有一个用于添加和删除过滤器的UI,因此你必须将过滤器引用保持在正确的按钮上。为此,您可以使用View.setTag(bigEventFilter)
/ View.getTag()
作为示例。
我用适配器展示了这个例子,因为这是最常见的用例。但是您可以轻松地将其更改为具有getFilteredItems()
方法的普通对象,该方法返回内部_filteredItems
列表。