美文网首页程序员
Android之EditText检索Listview,匹配关键字

Android之EditText检索Listview,匹配关键字

作者: Android砖家 | 来源:发表于2018-03-08 11:16 被阅读0次

    需求背景:在android 开发中,我们经常用EditText通过搜索关键字,来查询listview里面的内容,并且关键字高亮显示。

    基础知识点

      1. EditText监听文本变化:addTextChangedListener()
    • 2.adapter收到文本变化之后,刷新listview notifyDataSetChanged()

    话不多说,直接上代码:

    1.先撸个布局:布局就没啥好说的啦,简单粗暴

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp"
        android:orientation="vertical"
        tools:context="com.yhx.app.MainActivity">
    
        <EditText
            android:id="@+id/editText"
            android:layout_width="match_parent"
            android:layout_height="50dp"
            />
    
    
        <ListView
            android:id="@+id/listview"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        </ListView>
    
    
    </LinearLayout>
    

    2.当然写个adapter 适配器,这里demo 我就用Listview了,实际项目中,大佬们还是用Recyclerview 哦,这个没得说。

    class ListAdapter extends BaseAdapter {
            private String changeStr = "";
            //
            private List<String> mlistdatas;
            private LayoutInflater mInflater;
    
            public ListAdapter(Context mcontext, List<String> mlistdatas) {
                this.mlistdatas = mlistdatas;
                mInflater = LayoutInflater.from(mcontext);
            }
    
            @Override
            public int getCount() {
                return mlistdatas.size();
            }
    
            @Override
            public Object getItem(int i) {
                return mlistdatas.get(i);
            }
    
            @Override
            public long getItemId(int i) {
                return i;
            }
    
            @Override
            public View getView(int i, View view, ViewGroup viewGroup) {
    
                view = mInflater.inflate(R.layout.search_layout_item, null);
                TextView tv_name = view.findViewById(R.id.text_name);
                tv_name.setText(mlistdatas.get(i));
                  //处理关键字颜色变化
                if (null != mlistdatas.get(i) && mlistdatas.get(i).contains(changeStr)) {
                    int index = mlistdatas.get(i).indexOf(changeStr);
                    int len = changeStr.length();
                    Spanned temp = Html.fromHtml(mlistdatas.get(i).substring(0, index)
                            + "<font color=#ff0000>"
                            + mlistdatas.get(i).substring(index, index + len) + "</font>"
                            + mlistdatas.get(i).substring(index + len, mlistdatas.get(i).length()));
                    tv_name.setText(temp);
                } else {
                    tv_name.setText(mlistdatas.get(i));
                }
    
                return view;
            }
            
             //这个方法很重要,editText监听文本变化需要用到
            public void changeText(String textStr) {
                this.changeStr = textStr;
              //别忘了,notifyDataSetChanged()一定要调用,一定要调用,一定要调用,重要事说三遍
                notifyDataSetChanged();
    
            }
        }
    

    adapter item 布局文件:search_layout_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical">
    
    
        <TextView
            android:id="@+id/text_name"
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:gravity="center_vertical"
            android:padding="8dp"
            android:text="简书你好"
            android:textColor="#333333"/>
    
    </LinearLayout>
    

    Maintivity使用:

    public class MainActivity extends AppCompatActivity {
        private ListView mlistview;
        private EditText meditText;
        private ListAdapter mListAdapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mlistview = (ListView) findViewById(R.id.listview);
            meditText = (EditText) findViewById(R.id.editText);
            //
            mListAdapter = new ListAdapter(this, initData());
            mlistview.setAdapter(mListAdapter);
    
    
            //meditText监听文本变化
            meditText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
                }
    
                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                  //告诉adapter 文本有变化了
                    mListAdapter.changeText(charSequence.toString());
                }
    
                @Override
                public void afterTextChanged(Editable editable) {
    
                }
            });
        }
    
        private List<String> initData() {
            List<String> mlistdata = new ArrayList<>();
            mlistdata.add("我的第一写作,简书");
            mlistdata.add("很多年以后,开始相信,所谓爱情,都是因为寂寞");
            mlistdata.add("曾经企盼有地老天荒的爱情,有海枯石烂的情缘");
            mlistdata.add("爱情不是游戏,因为我们玩不起");
            mlistdata.add("爱情不是游戏,因为我们玩不起");
            mlistdata.add("爱,不是一个人的独角戏,而是两个人的对手戏");
            mlistdata.add("爱,不是一个人的独角戏,而是两个人的对手戏");
            mlistdata.add("每个人心里,都有个过不去的人");
            mlistdata.add("每个人心里,都有个过不去的人");
            mlistdata.add("异地恋,恋的不仅仅是爱情,还有一种坚持");
            mlistdata.add("异地恋,恋的不仅仅是爱情,还有一种坚持");
            mlistdata.add("曾经,一遍遍的思念,一遍遍的在心里抱怨");
            mlistdata.add("爱与被爱同样是受伤害,谁先不爱谁先离开");
            mlistdata.add("还有de小星");
            return mlistdata;
    
        }
    }
    

    少不了老铁们需要的效果图,一切源于效果图说话

    yhx.gif

    后记:没有啥技术含量,但简单粗暴,实用,不就是这样吗 哈哈哈哈。

    相关文章

      网友评论

        本文标题:Android之EditText检索Listview,匹配关键字

        本文链接:https://www.haomeiwen.com/subject/bhgefftx.html