如何实现android listview的过滤器

时间:2012-04-30 06:14:40

标签: android listview filter

我有模型对象数据的数组,我在自定义ArrayAdapter中的模型对象数组中显示listview中的文本和图像。

它像android联系人视图,我想实现搜索功能。

任何人都可以请教我,如何实现自定义适配器的过滤器,它显示来自模型对象的数据。

示例示例链接或代码片段也没问题。

2 个答案:

答案 0 :(得分:0)

您只需要过滤底层集合(例如:What is the best way to filter a Java Collection?

当过滤条件发生变化时,您只需发出更改数据集的信号,并使用过滤列表实例提供条目数量和单个视图

答案 1 :(得分:0)

我实际上不喜欢复制原始列表的方法。这既费时又耗费内存。我采取的方法只是让想要的物品可见,而不想要的物品是GONE。 我的示例是TableLayout,我在其中过滤TableRows,每个都有一个TextView。

public void filter(TableLayout tl, String regex) {
    TableRow tr;
    TextView tv;
    Pattern p;
    Matcher m;

    p = Pattern.compile(regex);
    int n = tl.getChildCount();
    for(int i = 0; i < n; i++) {
        tr = (TableRow) tl.getChildAt(i);
        tv = (TextView) tr.getChildAt(0);
        m = p.matcher(tv.getText());
        if(m.find()) {
            tr.setVisibility(View.VISIBLE);
        } else {
            tr.setVisibility(View.GONE);
    }
}

我没有对它进行分析,但我确信它比复制列表中的所有元素然后过滤然后显示新列表要快。

随着你的名单变大,优势应该更加明显。

但是,需要注意的是,我必须承认,尽管它可以很好地过滤几百行,但我担心当行数太大而需要超过5秒才能进行过滤时会发生什么。然后它应该触发App无响应对话框 我试图使它成为一个线程,但因为我直接处理视图可见性我得到一条错误消息,只有原始线程可以触摸视图。我正在努力,我相信我会找到解决方案。