【问题标题】:How to implement filter for android listview如何为android listview实现过滤器
【发布时间】:2012-05-09 21:25:31
【问题描述】:

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

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

谁能给我建议,如何为自定义适配器实现过滤器,以显示来自模型对象的数据。

示例链接或代码的 sn-p 也可以。

【问题讨论】:

标签: android listview filter


【解决方案1】:

你只需要过滤底层集合(像这样:What is the best way to filter a Java Collection?

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

【讨论】:

  • 您好,谢谢您的回复。有什么直接的API可以做吗?还是我们需要实现可过滤的接口?
  • 在另一篇文章中有一些参考。但是你也可以在迭代原始列表时只做愚蠢的过滤。创建新列表并从旧列表中添加一些值很便宜 - 它不涉及大量内存分配
【解决方案2】:

我实际上不喜欢复制原始列表的方法。它既耗时又耗内存。我采取的方法只是让想要的物品可见,而不需要的物品消失。 我的示例是用于过滤 TableRows 的 TableLayout,每个都有一个 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 秒时会发生什么。然后它应该触发应用程序无响应对话框。
我试图让它成为一个线程,但是因为我直接处理视图可见性,我收到一条错误消息,只有原始线程可以接触视图。我正在努力,我相信我会找到解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-06
    • 2019-01-11
    • 2012-01-24
    • 1970-01-01
    • 2015-09-29
    • 2013-01-15
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多