2010-05-17 73 views
0

我创建了一个包含ListView的布局。ArrayAdapter和android:textFilterEnabled

此ListView中显示的数据不是太复杂,它主要是在扩展活动启动时传递的数组。

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

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

所以现在我的问题是:我知道我需要告诉textfilter应该过滤什么,我也还是我的数组充满了文本应该得到过滤,让我怎么夫妇这两个?

我见过扩展CursorAdapter的例子,但是我没有光标,我也不想调用数据库,我想重新利用我的数组和数据,显然是ArrayAdapter本身数据将在屏幕上体现出来(即用我的ImageView和TextView布局)。

这怎么办?

回答

0

我能够使用ArrayAdapter与“字符串” s的泛型参数(即我ArrayAdapter<String> ... = new ArrayAdapter<String>(...)创建它),在的ListView和呼叫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"); 
} 

我还没有与基于非字符串适配器尝试一下,你可以从here获得生成的代码。在这种情况下,我创建了一个名为的项目,这就是我想要放入我的ListViewArrayAdapter。它可以过滤对无论是由对象的的toString方法返回。在这个例子中,我的toString过滤器对项目的名称。请注意,与上述情况下,我设置好的了机器人:在我看来的XML文件,而不是调用setTextFilterEnabled textFilterEnabled财产,就像你曾形容。

+0

好的,我明白你实际上是直接用view.setFilterText(“ap”); 但我如何从标准Android的TextFilter中检索“ap”字母?我确实在屏幕上看到它,但事后我必须知道用户在输入什么内容,如何实现这一点? – TiGer 2010-05-17 13:31:14

2

您的自定义适配器必须实现Filterable接口,覆盖getFilter()并返回其沿getFilter()Filter一个类的实例。

我这样做的方式是创建一个过滤类的实例,并将其存储在我的适配器中的一个final实例变量中,并在调用getFilter()时返回该实例变量。

看看ArrayAdapter源代码,以更好地了解如何自己完成过滤。