首先,您需要创建一个同时具有EditText和ListView的XML布局。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- Pretty hint text, and maxLines -->
<EditText android:id="@+building_list/search_box"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="type to filter"
android:inputType="text"
android:maxLines="1"/>
<!-- Set height to 0, and let the weight param expand it -->
<!-- Note the use of the default ID! This lets us use a
ListActivity still! -->
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
/>
</LinearLayout>
这将正确布局所有内容,并在ListView上方带有一个不错的EditText。接下来,像往常一样创建一个ListActivity,但是setContentView()
在onCreate()
方法中添加一个调用,以便我们使用我们最近声明的布局。请记住,我们ListView
特别对ID进行了编号android:id="@android:id/list"
。这样可以让我们ListActivity
知道ListView
我们要在声明的布局中使用哪个。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filterable_listview);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
getStringArrayList());
}
现在运行该应用程序应显示您以前的应用程序ListView
,并在上方带有一个漂亮的框。为了使该框起作用,我们需要从中获取输入,并使该输入过滤列表。尽管许多人都尝试手动执行此操作,但大多数 ListView
Adapter
类都带有一个Filter
对象,该对象可用于自动执行过滤。我们只需要将输入从传送EditText
到即可Filter
。事实证明,这很容易。要运行快速测试,请将此行添加到onCreate()
通话中
adapter.getFilter().filter(s);
请注意,您需要将您的代码保存ListAdapter
到变量中才能完成此工作-我已经将我ArrayAdapter<String>
以前的代码保存到了名为“ adapter”的变量中。
下一步是从中获取输入EditText
。这实际上需要一些思考。你可以添加OnKeyListener()
到您的EditText
。但是,此侦听器仅收到一些关键事件。例如,如果用户输入“ wyw”,则预测文本可能会推荐“ eye”。在用户选择“ wyw”或“ eye”之前,您OnKeyListener
不会收到按键事件。有些人可能更喜欢这种解决方案,但我发现它令人沮丧。我想要每个关键事件,因此可以选择过滤还是不过滤。解决的办法是TextWatcher
。只需创建一个并将其添加TextWatcher
到中EditText
,然后在ListAdapter
Filter
每次文本更改时通过一个过滤器请求。切记删除TextWatcher
in OnDestroy()
!这是最终的解决方案:
private EditText filterText = null;
ArrayAdapter<String> adapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filterable_listview);
filterText = (EditText) findViewById(R.id.search_box);
filterText.addTextChangedListener(filterTextWatcher);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
getStringArrayList());
}
private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
adapter.getFilter().filter(s);
}
};
@Override
protected void onDestroy() {
super.onDestroy();
filterText.removeTextChangedListener(filterTextWatcher);
}