键入时的Android搜索列表

如何在我输入结果的同时构建一个搜索栏,在我正在搜索的ListView中显示?

例如,我有一个包含20个字符串的列表视图。 我按下搜索键并显示栏。 我希望当我键入3个或更多单词时,搜索开始运行,在列表视图中显示结果(作为filter:仅显示列表中与我键入的内容相匹配的字符串)

  • Android Market,搜索结果位置神秘
  • 突出显示ListView项目中的搜索文本
  • 带有搜索实现的CursorTreeAdapter
  • 一个AndroidManifest.xml中的两个searchable.xml活动
  • 如何在搜索时删除android searchviewpopup文本?
  • Android SearchRecentSuggestions - 在SearchView中输入时不会显示建议
  • 为什么我的可搜索活动的Intent.getAction()为null?
  • 您无法使用搜索栏执行此操作。 但是listview有可能过滤按键 ,就像在联系人中完成一样。 用户只需开始输入,然后列表就会被过滤掉。 过滤并不像搜索。 如果你的列表中包含单词foo,你输入的oo foo将被过滤掉,但是如果你键入fo,即使列表项是call bar foo,它也会保留。

    你只需要启用它:

     ListView lv = getListView(); lv.setTextFilterEnabled(true); 

    如果您没有硬件键盘,我不知道如何做到这一点。 我正在使用droid并开始输入开始列表进行过滤并仅显示匹配的结果。

    我相信这就是你要找的东西:

    http://www.java2s.com/Code/Android/2D-Graphics/ShowsalistthatcanbefilteredinplacewithaSearchViewinnoniconifiedmode.htm

    让您的Activity实现SearchView.OnQueryTextListener

    并添加以下方法:

     public boolean onQueryTextChange(String newText) { if (TextUtils.isEmpty(newText)) { mListView.clearTextFilter(); } else { mListView.setFilterText(newText.toString()); } return true; } public boolean onQueryTextSubmit(String query) { return false; } 

    我使用EditText来完成这项工作。

    首先,我创建了两个数组副本来保存要搜索的数据列表:

     List> vehicleinfo; List> vehicleinfodisplay; 

    一旦我从某个地方获得了我的列表数据,我就复制它:

     for(Mapmap : vehicleinfo) { vehicleinfodisplay.add(map); } 

    并使用SimpleAdapter显示我的数据的显示(复制)版本:

     String[] from={"vehicle","dateon","dateoff","reg"}; int[] to={R.id.vehicle,R.id.vehicledateon,R.id.vehicledateoff,R.id.vehiclereg}; listadapter=new SimpleAdapter(c,vehicleinfodisplay,R.layout.vehiclelistrow,from,to); vehiclelist.setAdapter(listadapter); 

    然后我向EditText添加了一个TextWatcher ,它通过清除列表的显示版本,然后仅添加符合搜索条件的其他列表中的项目来响应afterTextChanged事件(在这种情况下,“reg”字段包含搜索串)。 使用筛选列表填充显示列表后,我只需在列表的SimpleAdapter上调用SimpleAdapter

     searchbox.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { vehicleinfodisplay.clear(); String search=s.toString(); for(Mapmap : vehicleinfo) { if(map.get("reg").toLowerCase().contains(search.toLowerCase())) vehicleinfodisplay.add(map); listadapter.notifyDataSetChanged(); } }; ... other overridden methods can go here ... }); 

    希望这对某人有帮助。

    使用以下代码在android中实现搜索和过滤列表:

    SearchAndFilterList.java

     public class SearchAndFilterList extends Activity { private ListView mSearchNFilterLv; private EditText mSearchEdt; private ArrayList mStringList; private ValueAdapter valueAdapter; private TextWatcher mSearchTw; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search_and_filter_list); initUI(); initData(); valueAdapter=new ValueAdapter(mStringList,this); mSearchNFilterLv.setAdapter(valueAdapter); mSearchEdt.addTextChangedListener(mSearchTw); } private void initData() { mStringList=new ArrayList(); mStringList.add("one"); mStringList.add("two"); mStringList.add("three"); mStringList.add("four"); mStringList.add("five"); mStringList.add("six"); mStringList.add("seven"); mStringList.add("eight"); mStringList.add("nine"); mStringList.add("ten"); mStringList.add("eleven"); mStringList.add("twelve"); mStringList.add("thirteen"); mStringList.add("fourteen"); mSearchTw=new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { valueAdapter.getFilter().filter(s); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }; } private void initUI() { mSearchNFilterLv=(ListView) findViewById(R.id.list_view); mSearchEdt=(EditText) findViewById(R.id.txt_search); } } 

    自定义值适配器: ValueAdapter.java

     public class ValueAdapter extends BaseAdapter implements Filterable{ private ArrayList mStringList; private ArrayList mStringFilterList; private LayoutInflater mInflater; private ValueFilter valueFilter; public ValueAdapter(ArrayList mStringList,Context context) { this.mStringList=mStringList; this.mStringFilterList=mStringList; mInflater=LayoutInflater.from(context); getFilter(); } //How many items are in the data set represented by this Adapter. @Override public int getCount() { return mStringList.size(); } //Get the data item associated with the specified position in the data set. @Override public Object getItem(int position) { return mStringList.get(position); } //Get the row id associated with the specified position in the list. @Override public long getItemId(int position) { return position; } //Get a View that displays the data at the specified position in the data set. @Override public View getView(int position, View convertView, ViewGroup parent) { Holder viewHolder; if(convertView==null) { viewHolder=new Holder(); convertView=mInflater.inflate(R.layout.list_item,null); viewHolder.nameTv=(TextView)convertView.findViewById(R.id.txt_listitem); convertView.setTag(viewHolder); }else{ viewHolder=(Holder)convertView.getTag(); } viewHolder.nameTv.setText(mStringList.get(position).toString()); return convertView; } private class Holder{ TextView nameTv; } //Returns a filter that can be used to constrain data with a filtering pattern. @Override public Filter getFilter() { if(valueFilter==null) { valueFilter=new ValueFilter(); } return valueFilter; } private class ValueFilter extends Filter { //Invoked in a worker thread to filter the data according to the constraint. @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results=new FilterResults(); if(constraint!=null && constraint.length()>0){ ArrayList filterList=new ArrayList(); for(int i=0;i) results.values; notifyDataSetChanged(); } } } 

    activity_search_and_filter_list.xml

         

    list_item.xml

     < ?xml version="1.0" encoding="utf-8"?>    

    AndroidManifext.xml

                

    我希望这段代码将有助于实现自定义搜索和过滤列表视图

    最好的方法是通过在可搜索的活动中覆盖onSearchRequested来使用内置搜索栏或SearchManager。 您可以设置要搜索的数据源以获取结果的自动下拉,或者您可以从用户接收输入并在之后搜索。 以下是对SearchManager的一个很好的概述。在API Demos项目中有一个工作演示com.example.android.apis.app.SearchQueryResult

     @Override public boolean onSearchRequested() {