0

我创建了一个包含 ListView 的布局。

这个 ListView 中显示的数据并不太复杂,它主要是一个 Array,在扩展 Activity 启动时传递。

行本身存在于图标和文本之外,因此存在 ImageView 和 TextView。为了填充 ListView,我使用 ArrayAdapter 只是因为传递了一个包含所有应该显示的文本项的数组。

现在我希望实际上能够过滤这些,因此我找到了要在 ListView xml 声明中添加的 android:textFilterEnabled 参数......现在搜索字段显示得很好但是当我输入一些字母时它不会过滤但是它只会删除整个列表。我发现那是因为 textfilter 不知道它应该过滤什么。

所以现在我的问题是:我知道我需要告诉 textfilter 它应该过滤什么,我的数组仍然充满了应该被过滤的文本,那么我如何将这两者结合起来?

我已经看到扩展 CursorAdapter 的示例,但同样,我没有 Cursor,我不想调用 DB 我想用数据重新利用我的 Array,显然是 ArrayAdapter 本身,以便数据将在屏幕上体面地表示(即使用我的 ImageView 和 TextView 布局)。

如何才能做到这一点?

4

2 回答 2

2

Your custom adapter has to implement the Filterable interface, override getFilter() and return an instance of a class which extends Filter in getFilter().

The way I did it was to create an instance of the filtering class and store it in a final instance variable inside my adapter and return that when getFilter() is called.

Have a look at the ArrayAdapter source code to get a better idea of how to do the filtering yourself.

于 2010-05-17T14:50:27.877 回答
0

我能够在 ListView 中使用带有“String”s 的ArrayAdapter作为泛型参数(即我创建它ArrayAdapter<String> ... = new ArrayAdapter<String>(...)),并以编程方式调用setTextFilterEnabledsetFilterText将它们过滤掉。下面是我在ListActivity中的做法:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    // This array list will be updated each time.
    final ArrayList<String> data = new ArrayList<String>();
    data.add("apple");
    data.add("orange");
    data.add("tomato");
    dataAdapter = new ArrayAdapter<String>(this, R.layout.item,
        R.id.itemName, data);

    setListAdapter(dataAdapter);
    ListView view = getListView();
    view.setTextFilterEnabled(true);
    view.setFilterText("ap");
}

我也使用非基于字符串的适配器进行了尝试,您可以从此处获取生成的代码。在这种情况下,我创建了一个名为Item的对象,这是我想要放入ListViewArrayAdapter的对象。它过滤对象的toString方法返回的任何内容。在示例中,我使用toString过滤项目名称。请注意,与上述情况不同,我在视图的 XML 文件中设置了android:textFilterEnabled属性,而不是调用setTextFilterEnabled,正如您所描述的那样。

于 2010-05-17T12:34:52.180 回答