我有自定义适配器的ListView扩展ArrayAdapter。每个项目都是对象:
public class ListItemObject {
public String messageText;
public long messageTime;
public long fromId;
public long toId;
}
我想在菜单中添加可检查项目以进行过滤切换。因此,当此项目未选中时,我将显示所有项目,并且当此项目选中时,ListView必须仅包含具有以下条件的已过滤项目:
if(fromId==myId || toId==myId) {
//show item
} else {
//don't show item
}
我认为有两种方法可以实现这一点:
让我自己的过滤器扩展过滤器。然后调用adapter.getFilter()。filter(string_with_fromId_and_toId_in_JSON)。我在这里看到一个问题:所有外观适配器只能包含一个过滤器。如果我想在将来添加另一个过滤器,我不能这样做。
保存适配器外的所有项目,清除它并再次使用过滤后的数据填充。这对我来说不方便,但我可以做到。
如何更好地实现这个目标?
答案 0 :(得分:2)
我用过两者。我创建了一个类似FILTER_BY_CUSTOM_COLLECTION
的标志,并将其作为constraint
参数发送到过滤器函数。如果约束等于我的标志我做自定义过滤器,否则我使用该约束作为真正的文本约束:
MyFilter filter = (MyFilter) adapterDocumentDetails.getFilter();
filter.itemsForFilterResult = anyCollection
filter.filter(MyFilter.FILTER_BY_CUSTOM_COLLECTION,
new FilterListener() {
@Override
public void onFilterComplete(int count) {
}
});
在我的过滤器中:
public final static String FILTER_BY_CUSTOM_COLLECTION = "@@FILTER_BY_CUSTOM_COLLECTION@@";
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (constraint.toString().compareTo(
FILTER_BY_CUSTOM_COLLECTION) == 0
&& itemsForFilterResult != null)
{
filteredCollection = itemsForFilterResult;
}
else
{
for (int i = 0; i < allItems.size(); i++)
{
ListItemObject item= allItems.get(i);
if(item.messageText.contains(constraint))
{
filteredCollection.add(item);
}
}
}
}