EditText+ListView实现AutoCompleteTextView效果

布局文件使用相对布局   定义一个EditText   drawableLeft属性加个搜索图标,属性imeOptions设置为actionSearch来更换软键盘的右下角建为搜索建。

<EditText
    android:id="@+id/et_query"
    android:layout_width="match_parent"
    android:layout_height="30dp"
    android:drawableLeft="@mipmap/ic_search_api_mtrl"
    android:imeOptions="actionSearch"
    android:drawablePadding="8dp"
    android:hint="查询单词"
    android:background="@drawable/query_word_shape"
    android:layout_marginRight="50dp"
    android:layout_marginLeft="10dp"
    android:layout_centerInParent="true"
    android:layout_alignParentLeft="true"
    android:singleLine="true"
    android:textColor="#d1f57f"
    />

定义一个ImageView为×图标在EditText右边隐藏,以便后面监听EditText的文本改变事件时显示该叉号图标,点击图标可清空EditText文本内容。


定义一个ListView。创建数据源时使用两个集合,这里称为大集合和小集合。使用小集合作为数据源创建一个BaseAdapter用来设置给ListView。


//输入框添加文本变化监听器
et_query.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }
    //文本变化后
    @Override
    public void afterTextChanged(Editable s) {
        if (s.length() > 0){    //文本内容大于0
            iv_query_delete.setVisibility(View.VISIBLE);    //显示删除按钮
            list_word.clear();  //先清空lv集合数据
            showListViewData(); //再添加数据
            mAdapter.notifyDataSetChanged();    //通知lv更新
            lv_query.setVisibility(View.VISIBLE);   //显示listview
            ll_query_wordInfo.setVisibility(View.GONE); //隐藏单词信息
        }else {
            iv_query_delete.setVisibility(View.GONE);   //隐藏删除按钮
            list_word.clear();  //清空集合数据
            mAdapter.notifyDataSetChanged();    //通知lv更新
            lv_query.setVisibility(View.VISIBLE);   //显示listview
            ll_query_wordInfo.setVisibility(View.GONE); //隐藏单词信息
        }
    }
});


//将总集合里的数据里包含文本框的数据添加到ListView数据集合
private void showListViewData() {
    String data = et_query.getText().toString();
    for (int i=0; i<list.size(); i++){
        if (list.get(i).contains(data)){
            list_word.add(list.get(i));
        }
    }
}

EditText设置文本变化监听器,addTextChangedListener来判断文本内容。如果内容长度大于0,则显示×叉图标,清空小集合以便每输入一个字符串重新显示数据,添加数据的方法中首先获取文本内容,如果大集合里的内容包含该文本内容则将大集合里的内容添加到小集合。适配器通知listview更新数据显示。


et_query.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH){
            data = et_query.getText().toString();
            if (list.contains(data)){
                //设置单词信息
                setWordInfo();
                return false;
            }else {
                ll_query_wordInfo.setVisibility(View.GONE);//隐藏单词信息
                lv_query.setVisibility(View.VISIBLE);   //显示listView
                return true;//这里返回true表示方法回调完系统不需再处理。
            }
        }
        return false;
    }
});



文本框设置软键盘按钮监听器setOnEditorActionListener,如果actionId为搜索键,获取文本框内容,如果大集合包含该内容则设置信息并返回false将软键盘隐藏,否则返回true不隐藏软键盘。


et_query.setOnKeyListener(onKeyListener);   //设置输入法软键盘右下角按钮监听器

//输入法软键盘返回键的监听器
private View.OnKeyListener onKeyListener = new View.OnKeyListener() {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK
                && event.getAction() == KeyEvent.ACTION_DOWN) {
            list_word.clear();
            Log.d("seven", "清空了哈哈哈哈");
            return false;   //这里返回的boolean类型表示是否还需要系统处理,false表示方法回调完系统再处理返回。
        }
        return false;
    }
};

文本框设置软键盘返回键的监听器,onKeyListener。如果keyCode为返回键,则清空小集合数据,防止在搜索中输入字符串后listview显示数据按了返回键后再回来查询时小集合有数据。并返回false,隐藏软键盘。



//隐藏软键盘
InputMethodManager manager = (InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
if (manager.isActive()){
    manager.hideSoftInputFromWindow(et_query.getWindowToken(), 0);
}


隐藏软键盘的方法:

获取InputMethodManager,调用hideSoftInputFromWindow,传入文本框的getWindowToken()、0即可。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值