Android是否可以为ListView设置搜索栏,以便在触摸搜索栏时弹出键盘,当在搜索栏中输入文本时,会显示ListView中匹配的项目?
我真正需要的是带有键盘的搜索栏.
更新:
我添加了EditText字段,它会调出一个键盘,我可以输入EditText字段.我想要的是让ListView中显示的列表中项目的前几个字符与EditText窗口中输入的字符相匹配.
我试过按照ListView Filter中列出的方法尝试,但是我对ListView中已经完成了多少过滤有点困惑?
1)我是否需要创建一个单独的数组来存储与EditText中键入的文本相匹配的值?从这篇文章调用adapter.notifyDataSetChanged,看来ListView已经有一个shadow数组来执行此操作,并在adapter.notifyDataSetChanged(); 叫做.
2)我是否需要调用adapter.notifyDataSetChanged(); 在EditText窗口中键入一些文本后更新ListView?
3)我是否需要扩展ListActivity,如此帖所示?如果是这样,如果活动类已经从主活动扩展,我该如何扩展我的活动类?
4)我目前拥有以下内容:
ArrayAdapter<String> adapter = null;
private EditText filterText = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.symptom);
ListView symptomList = (ListView) findViewById(R.id.ListView_Symptom);
symptomList.setTextFilterEnabled(true);
symptomList.setFastScrollEnabled(true);
filterText = (EditText) findViewById(R.id.search_box);
filterText.addTextChangedListener(filterTextWatcher);
adapter = new ArrayAdapter<String>(this, R.layout.menu_item, symptomsArray);
symptomList.setAdapter(adapter);
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);
adapter.notifyDataSetChanged();
}
};
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我输入EditText框时,我得到一个NullPointer异常
Thread [<7> Filter] (Suspended (exception NullPointerException))
ArrayAdapter$ArrayFilter.performFiltering(CharSequence) line: 437
Filter$RequestHandler.handleMessage(Message) line: 234
Filter$RequestHandler(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 123
HandlerThread.run() line: 60
Run Code Online (Sandbox Code Playgroud)
知道我错过了什么吗?
Har*_*iya 19
您犯了一个非常小的错误: - 在设置文本之前创建数组适配器更改侦听器到编辑文本
看到更正的代码
public class SearchListView extends Activity
{
/** Called when the activity is first created. */
private ListView lv1;
private String lv_arr[] =
{ "Android", "iPhone", "BlackBerry", "me", "J2ME", "Listview", "ArrayAdapter", "ListItem", "Us", "UK", "India" };
ListView lst;
EditText edt;
ArrayAdapter<String> arrad;
@Override
public void onCreate( Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lv1=(ListView)findViewById(R.id.ListView01);
edt = (EditText) findViewById(R.id.EditText01);
arrad = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1 , lv_arr);
lv1.setAdapter(arrad);
// By using setTextFilterEnabled method in listview we can filter the listview items.
lv1.setTextFilterEnabled(true);
edt.addTextChangedListener(new TextWatcher()
{
@Override
public void onTextChanged( CharSequence arg0, int arg1, int arg2, int arg3)
{
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged( CharSequence arg0, int arg1, int arg2, int arg3)
{
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged( Editable arg0)
{
// TODO Auto-generated method stub
SearchListView.this.arrad.getFilter().filter(arg0);
}
});
}
Run Code Online (Sandbox Code Playgroud)
}
| 归档时间: |
|
| 查看次数: |
26124 次 |
| 最近记录: |