效果图

Android 用EditText实现搜索框功能_第1张图片


思路

为EditText添加TextChangedListener接口,在接口的afterTextChanged方法里面实现搜索功能


工程目录结构

Android 用EditText实现搜索框功能_第2张图片


1.MainActivity.java

import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;import java.util.ArrayList;import java.util.List;public class MainActivity extends Activity {    private ListView listView;      //列表    private SearchView searchView;  //搜索框    private List data = new ArrayList<>();  //ListView数据源    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //获取控件        listView = (ListView) findViewById(R.id.listView);        searchView = (SearchView) findViewById(R.id.searchView);//        //设置延时搜索,延时2秒//        searchView.setWaitTime(2000);        //设置搜索方法        searchView.setSearchWay(new SearchView.SearchWay(){            @Override            public List getData() {                //返回数据源                return data;            }            @Override            public boolean matchItem(String item, String s) {                //如果串item中包含串s,则匹配                return item.contains(s);            }            @Override            public void update(List resultList) {                //更新ListView的数据                setListViewData(resultList);            }        });        initListView();    }    /**     * 初始化ListView     */    private void initListView(){        //初始化字符数组        for (int i = 0; i < 20; i++){            data.add("第" + i + "项");        }        //初始化ListView的内容        setListViewData(data);    }    /**     * 设置ListView的内容     */    private void setListViewData(List list){        //设置ListView的适配器        ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, list);        listView.setAdapter(adapter);    }}

2.SearchView.java

import android.content.Context;import android.content.res.TypedArray;import android.os.Handler;import android.os.Message;import android.text.Editable;import android.text.TextWatcher;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.EditText;import android.widget.ImageView;import android.widget.LinearLayout;import java.util.ArrayList;import java.util.List;/** * Created by Administrator on 2016/8/31. * 搜索框 */public class SearchView extends LinearLayout implements TextWatcher{    private EditText et_search;     //输入框    private ImageView iv_clear;     //删除图标    private SearchWay mSearch;      //匹配方法    private String searchText;      //改变后的文字    private WaitThread waitThread;  //等待线程    private int waitTime = 200;     //延时搜索时间,默认200ms    private int curTime;            //当前延时时间    private Handler mHandler;    public SearchView(Context context, AttributeSet attrs) {        super(context, attrs);        //加载布局文件        View view = LayoutInflater.from(context).inflate(R.layout.view_search, null);        //获取控件        et_search = (EditText) view.findViewById(R.id.et_search);        iv_clear = (ImageView) view.findViewById(R.id.iv_clear);        //设置清空按钮的触发器        iv_clear.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                et_search.setText("");            }        });        //读取属性        TypedArray typed = context.obtainStyledAttributes(attrs, R.styleable.SearchView);        String s;        //文字大小        float textSize = typed.getDimension(R.styleable.SearchView_sv_textSize, 15);        et_search.setTextSize(textSize);        //搜索框文字        s = typed.getString(R.styleable.SearchView_sv_text);        if (s != null){            et_search.setText(s);        }        //提示文字        s = typed.getString(R.styleable.SearchView_sv_hint);        if (s != null){            et_search.setHint(s);        }        //是否隐藏搜索图标        boolean hideImg = typed.getBoolean(R.styleable.SearchView_sv_hideImg, false);        if (hideImg) {            view.findViewById(R.id.img_search).setVisibility(GONE);        }        //回收资源        typed.recycle();        //文字改变监听        et_search.addTextChangedListener(this);        //异步处理        mHandler = new Handler(){            @Override            public void handleMessage(Message msg) {                //更新回调接口                if (0 == msg.what){                    waitThread = null;                    //匹配结果回调                    List searchList = new ArrayList();                    List list = mSearch.getData();                    if (list != null) {                        for (Object o : list) {                            if (mSearch.matchItem(o, searchText)) {                                searchList.add(o);                            }                        }                        mSearch.update(searchList);                    }                }            }        };        //把布局添加到当前控件中        ViewGroup.LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);        addView(view, params);    }    /**     * 设置匹配数据的方法     */    public void setSearchWay(SearchWay search){        mSearch = search;    }    /**     * 获取搜索框的文字     */    public String getText(){        return et_search.getText().toString();    }    public SearchWay getSearchWay() {        return mSearch;    }    @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.toString().isEmpty()){            iv_clear.setVisibility(GONE);        }else {            iv_clear.setVisibility(VISIBLE);        }        if (mSearch != null) {            if (null == waitThread) {                waitThread = new WaitThread();                waitThread.start();            } else {                //搜索框的文字发生变化就重置等待时间                if (!searchText.equals(s.toString())) {                    curTime = 0;                }            }        }        searchText = s.toString();    }    /**     * 设置搜索延时时间     * @param waitTime 毫秒,精度为100ms     */    public void setWaitTime(int waitTime){        this.waitTime = waitTime;    }    /**     * 延时搜索的线程     */    private class WaitThread extends Thread{        @Override        public void run() {            //等待延时            for (curTime = 0; curTime < waitTime; curTime += 100){                try {                    Thread.sleep(100);                }catch (InterruptedException e){                    e.printStackTrace();                }            }            mHandler.sendEmptyMessage(0);        }    }    /**     * 用于匹配项     */    public static abstract class SearchWay{        /**         * @return 数据源         */        public abstract List getData();        /**         * @return item中是否包含有s         */        public abstract boolean matchItem(T item, String s);        /**         * 更新列表         * @param resultList 匹配的数据,重新加载到列表         */        public abstract void update(List resultList);    }}

3.activity_main.xml

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

4.view_search.xml

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


5.attrs.xml

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

6. cleartext.png


7.search.png


更多相关文章

  1. Android 生成图标的有力工具 Android Asset Studio
  2. android launcher使hotseat item显示标题文字
  3. Android 仿IOS解锁锁屏文字抖动效果
  4. android绘制文字
  5. Android文字转语音TTS离线程序
  6. [转] Android 在程序中如何动态的修改程序图标
  7. Android9.0 修改状态栏图标之间的间距
  8. android paint设置字体 中文字体 楷体 和自动换行方法(zhuan)

随机推荐

  1. Android参数设置: Preference
  2. WebKit android介绍
  3. Android开发学习 之 一、开发环境的搭建
  4. android 修改系统各种类型的声音的默认值
  5. Android(安卓)Listview 隐藏滚动条
  6. Android(安卓)cmd 命令常用参数详解
  7. android背景选择器selector用法汇总
  8. Android实验法分析Touch事件传递
  9. android 超简单的拖动按钮 悬浮按钮 吸附
  10. Android音频开发之AudioTrack