zoukankan      html  css  js  c++  java
  • Android搜索自动提示功能 AutocompleteTextView

    Android搜索自动提示功能

    Android搜索自动提示功能

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

    <AutoCompleteTextView
                android:id="@+id/autotv_searchresult"
                android:layout_width="280dip"
                android:layout_height="35dip"
                android:layout_centerInParent="true"
                android:background="#00000000"
                android:completionThreshold="1"
                android:imeOptions="actionSearch"
                android:dropDownHeight="wrap_content"
                android:dropDownVerticalOffset="10dip"
                android:hint="搜索歌曲,歌手,音乐盒名..."
                android:singleLine="true" />

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

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

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/brandName"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    
        <TextView
            android:id="@+id/searchText"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:visibility="gone" />
    
    </LinearLayout>

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

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

    // 所有搜索的信息
     public static ArrayList<HashMap<String, String>> list_searchAll = new ArrayList<HashMap<String, String>>();
     // 一些搜索的信息
     public static ArrayList<HashMap<String, String>> list_searchSome = new ArrayList<HashMap<String, String>>();
    
     
    
    private void addAllSearch(String input, String output)
     {
      HashMap<String, String> item;
      item = new HashMap<String, String>();
      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<String, String> item;
      item = new HashMap<String, String>();
      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);
      
     }

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

  • 相关阅读:
    C#运行Javascript脚本Utility
    SQL Mail XPs Options
    TSQL AVG Functions
    eclipse编译时过滤SVN版本控制信息方法(转)
    追MM与设计模式
    android的性能调优
    对象的赋值和复制(转)
    SVN Working Copy xxx locked and cleanup failed
    HTTP协议详解(转)
    atoi和itoa函数的实现
  • 原文地址:https://www.cnblogs.com/niray/p/3877498.html
Copyright © 2011-2022 走看看