博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android搜索自动提示功能 AutocompleteTextView
阅读量:4352 次
发布时间:2019-06-07

本文共 5967 字,大约阅读时间需要 19 分钟。

 

 

1.配置main.xml中自动提示控件:

 

 

注:android:dropDownVerticalOffset="10dip"是可以将提示的信息与边框开一段距离的属性,通常都会用的到

 

2.建立搜索栏的布局.xml:

 

 

注: android:visibility="gone"这个是加入输入英文字母有中文提示的关键性代码

 

 

3.定义2个数组并在程序的开始给数组赋值:

// 所有搜索的信息 public static ArrayList
> list_searchAll = new ArrayList
>(); // 一些搜索的信息 public static ArrayList
> list_searchSome = new ArrayList
>(); private void addAllSearch(String input, String output) { HashMap
item; item = new HashMap
(); item.put("brandSearchText", input); item.put("brandName", output); list_searchAll.add(item); } private void addAllSearchItems() { addAllSearch("XBH xuebuhui xbh", "学不会"); addAllSearch("YXJ yixiangji yxj", "异想记"); addAllSearch("XWZ xiaowangzi wangzi", "小王子的漂流瓶"); addAllSearch("XYGZJ xiayige xygzj", "下一个自己"); addAllSearch("NYFZ nuoyafanzhou nyfz", "诺亚方舟"); addAllSearch("XT xintiao xt", "心跳"); addAllSearch("QS qinshang qs", "琴伤"); addAllSearch("AQSFYR aiqinshifou aqsf", "爱情是否依然"); addAllSearch("NZFRSM nizaifanrao nzfrsm", "你在烦扰什么"); addAllSearch("WMHGHD womenghuigenghaode wmhgh", "我们会更好的"); } private void addSomeSearch(String input, String output) { HashMap
item; item = new HashMap
(); item.put("brandSearchText", input); item.put("brandName", output); list_searchSome.add(item); } private void addSomeSearchItems() { // A addSomeSearch("AQMM aiqingmaima", "爱情买卖"); addSomeSearch("AWNJBBW aiwonijiubbw", "爱我你就抱抱我"); addSomeSearch("ABZJFFS aibuzaijiuffs", "爱不在就放放手"); // B addSomeSearch("BCYS banchengyansha", "半城烟沙"); addSomeSearch("BFSDLA bufengshoudelianai", "不分手的恋爱"); addSomeSearch("BYGSMM buyaogaoshumama", "不要告诉妈妈"); }

 

 

 

4.得到控件id,创建SimpleAdapter适配器:

private AutoCompleteTextView autotv_search;private SimpleAdapter mAdapter; autotv_search = (AutoCompleteTextView) findViewById(R.id.autotv_search);

 

注:适配器的实例化可以在监听中

 

5.设置AutoCompleteTextView的监听

private void autoSearchListen() {  autotv_search.setOnKeyListener(new View.OnKeyListener()  {   // 添加软键盘事件(让软键盘有一个搜索的图标)   @Override   public boolean onKey(View v, int keyCode, KeyEvent event)   {    // TODO Auto-generated method stub    if (keyCode == KeyEvent.KEYCODE_ENTER)    {     if (event.getAction() == KeyEvent.ACTION_UP)     {      InputMethodManager imm = (InputMethodManager) v        .getContext().getSystemService(          Context.INPUT_METHOD_SERVICE);      if (imm.isActive())      {       imm.hideSoftInputFromWindow(v         .getApplicationWindowToken(), 0);      }      return true;     }    }    return false;   }  });注:if (keyCode == KeyEvent.KEYCODE_ENTER)    {     if (event.getAction() == KeyEvent.ACTION_UP)     {   是当回车键起来的时候才触发不然会被调用2次,一次按下一次弹起    autotv_search.setOnClickListener(new OnClickListener()  {   @Override   public void onClick(View v)   {    // TODO Auto-generated method stub    if (autotv_search.getText().toString().equals(""))    {     mAdapter = new SimpleAdapter(SearchActivity.this,       HomeActivity.list_searchAll, R.layout.searchlist, new String[] {         "brandSearchText", "brandName" },       new int[] { R.id.tv_searchText, R.id.tv_brandName });     autotv_search.setAdapter(mAdapter);     autotv_search.showDropDown();    }   }  }); 注:点击搜索框触发,记得参数都要一一对应,你懂的...autotv_search.showDropDown();手动弹出提示    autotv_search.setOnFocusChangeListener(new OnFocusChangeListener()  {   @Override   public void onFocusChange(View v, boolean hasFocus)   {    if (hasFocus & autotv_search.getText().toString().equals(""))    {     mAdapter = new SimpleAdapter(SearchActivity.this,       HomeActivity.list_searchAll, R.layout.searchlist, new String[] {         "brandSearchText", "brandName" },       new int[] { R.id.tv_searchText, R.id.tv_brandName });     autotv_search.setAdapter(mAdapter);     autotv_search.showDropDown();    }   }  });    // 点击条目的监听  autotv_search.setOnItemClickListener(new OnItemClickListener()  {   @Override   public void onItemClick(AdapterView
parent, View view, int position, long id) { TextView tv = (TextView) view.findViewById(R.id.tv_brandName); autotv_search.setText(tv.getText().toString()); autotv_search.setSelection(autotv_search.getText().toString().length()); } }); //TextWatcher 是本应用的关键地方...这里感谢云童鞋给的提示,当字符产生变换的时候就调用 TextWatcher tw = new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // TODO Auto-generated method stub if (autotv_search.getText().toString().equals("")) { mAdapter = new SimpleAdapter(SearchActivity.this, HomeActivity.list_searchAll, R.layout.searchlist, new String[] { "brandSearchText", "brandName" }, new int[] { R.id.tv_searchText, R.id.tv_brandName }); autotv_search.setAdapter(mAdapter); autotv_search.showDropDown(); } else if (autotv_search.getText().toString().length() < 3) { mAdapter = new SimpleAdapter(SearchActivity.this, HomeActivity.list_searchSome, R.layout.searchlist, new String[] { "brandSearchText", "brandName" }, new int[] { R.id.tv_searchText, R.id.tv_brandName }); autotv_search.setAdapter(mAdapter); // mAdapter.notifyDataSetChanged(); } } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { // TODO Auto-generated method stub if (autotv_search.getText().toString().equals("")) { mAdapter = new SimpleAdapter(SearchActivity.this, HomeActivity.list_searchAll, R.layout.searchlist, new String[] { "brandSearchText", "brandName" }, new int[] { R.id.tv_searchText, R.id.tv_brandName }); autotv_search.setAdapter(mAdapter); autotv_search.showDropDown(); } } }; // 添加文字改变的监听 autotv_search.addTextChangedListener(tw); }

 

结束语:这样一直改变适配器的方法不知道会不会在性能上产生一定的问题...在真机上测试还是很快速的,程序还有很多要优化的地方,如果有更好的方法的还望指点呀...

转载于:https://www.cnblogs.com/niray/p/3877498.html

你可能感兴趣的文章
POJ 3624 01背包
查看>>
linux的基本操作(mysql 的基本操作)
查看>>
JS数字计算精度误差的解决方法
查看>>
Http请求帮助类
查看>>
Sharepoint学习笔记---Sandbox Solution-- Full Trust Proxy--开发实例之(2、在Webpart中访问Full Trust Proxy)...
查看>>
计应152班第3小组之讨论话题--软件的产品计划
查看>>
Oracle SQL 树形 查询
查看>>
Synopsys逻辑工艺库
查看>>
异步FIFO总结
查看>>
ETL的思考zz
查看>>
Linux tail 命令详解
查看>>
你会跟谁结婚zz
查看>>
Java线程安全和非线程安全
查看>>
CSS选择器
查看>>
Hadoop Hive概念学习系列之hive的脚本执行(二十)
查看>>
ivy VMware Mac
查看>>
四种方法重置xp系统密码
查看>>
委托与事件
查看>>
最长上升子序列问题(O(n^2)算法)
查看>>
混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。错误解决方法...
查看>>