recyclerview搜索關(guān)鍵字過濾列表內(nèi)容

當(dāng)Recyclerview綁定了一大段數(shù)據(jù)的時(shí)候胖腾、但我們有時(shí)候想要快速找到某一個(gè)item,這時(shí)候通過搜索關(guān)鍵字就能夠快速找到相應(yīng)的item了垛吗。

  • recyclerview 綁定數(shù)據(jù)到適配器adapter

    1. 初始化相關(guān)對象
        adapter = new InviteMessageAdapter(this);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);
  1. 綁定數(shù)據(jù)
    /**
     * 獲取申請信息
     */
    private void getInviteMessage() {
        if (inviteMessgeDao == null) {
            inviteMessgeDao = new InviteMessgeDao(this);
        }
        if (inviteMessgeDao.getMessagesList().size() != 0) {
            if (friends == null) {
                friends = new ArrayList<>();
            }
            friends.addAll(inviteMessgeDao.getMessagesList());
            adapter.setFriends(friends);
        }
    }
  • 自定義一個(gè)搜索輸入框

可以是一個(gè)普通的EditText,給他一個(gè)id:query

  1. query:添加文本變化監(jiān)聽事件:
 query.addTextChangedListener(new TextWatcher() {
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                //過濾操作
                adapter.getFilter().filter(s);
                if (s.length() > 0) {
                    searchClear.setVisibility(View.VISIBLE);
                } else {
                    searchClear.setVisibility(View.INVISIBLE);
                }
            }

            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            public void afterTextChanged(Editable s) {
            }
        });
  1. 清空文本
        //清除搜索內(nèi)容
        searchClear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                query.getText().clear();
            }
        });
  • adapter相關(guān)

  1. 綁定數(shù)據(jù)
 public void setFriends(List<InviteMessage> data) {
            //復(fù)制數(shù)據(jù)
            mCopyInviteMessages = new ArrayList<>();
            this.mCopyInviteMessages.addAll(data);
            this.inviteMessages = data;
            this.notifyDataSetChanged();
        }
  1. adapter實(shí)現(xiàn)android.widget.Filterable接口
        @Override
        public Filter getFilter() {
            return new Filter() {
                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
                    //初始化過濾結(jié)果對象
                    FilterResults results = new FilterResults();
                    //假如搜索為空的時(shí)候谍憔,將復(fù)制的數(shù)據(jù)添加到原始數(shù)據(jù)瘤缩,用于繼續(xù)過濾操作
                    if (results.values == null) {
                        inviteMessages.clear();
                        inviteMessages.addAll(mCopyInviteMessages);
                    }
                    //關(guān)鍵字為空的時(shí)候易结,搜索結(jié)果為復(fù)制的結(jié)果
                    if (constraint == null || constraint.length() == 0) {
                        results.values = mCopyInviteMessages;
                        results.count = mCopyInviteMessages.size();
                    } else {
                        String prefixString = constraint.toString();
                        final int count = inviteMessages.size();
                       //用于存放暫時(shí)的過濾結(jié)果
                        final ArrayList<InviteMessage> newValues = new ArrayList<InviteMessage>();
                        for (int i = 0; i < count; i++) {
                            final InviteMessage value = inviteMessages.get(i);
                            String username = value.getFrom();
                            EaseUser user = EaseUserUtils.getUserInfo(username);
                            if (user != null && user.getNick() != null) {
                                username = user.getNick();
                            }
                            // First match against the whole ,non-splitted value枚抵,假如含有關(guān)鍵字的時(shí)候伯病,添加
                            if (username.contains(prefixString)) {
                                newValues.add(value);
                            } else {
                                //過來空字符開頭
                                final String[] words = username.split(" ");
                                final int wordCount = words.length;

                                // Start at index 0, in case valueText starts with space(s)
                                for (int k = 0; k < wordCount; k++) {
                                    if (words[k].contains(prefixString)) {
                                        newValues.add(value);
                                        break;
                                    }
                                }
                            }
                        }
                        results.values = newValues;
                        results.count = newValues.size();
                    }
                    return results;//過濾結(jié)果
                }

                @Override
                protected void publishResults(CharSequence constraint, FilterResults results) {
                    adapter.inviteMessages.clear();//清除原始數(shù)據(jù)
                    adapter.inviteMessages.addAll((List<InviteMessage>) results.values);//將過濾結(jié)果添加到這個(gè)對象
                    if (results.count > 0) {
                        adapter.notifyDataSetChanged();//有關(guān)鍵字的時(shí)候刷新數(shù)據(jù)
                    } else {
                         //關(guān)鍵字不為零但是過濾結(jié)果為空刷新數(shù)據(jù)
                        if (constraint.length() != 0) {
                            adapter.notifyDataSetChanged();
                            return;
                        }
                        //加載復(fù)制的數(shù)據(jù)造烁,即為最初的數(shù)據(jù)
                        adapter.setFriends(mCopyInviteMessages);
                    }
                }
            };
        }
    }

本次筆記到此為止,實(shí)現(xiàn)方法就是這樣午笛,希望能夠?qū)δ阌袔椭洋N乙埠芟M玫侥愕闹附獭ithub 有個(gè)有關(guān)recyclerview過濾操作的開源項(xiàng)目可以去看看药磺,主要用到了searchview

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末告组,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子癌佩,更是在濱河造成了極大的恐慌木缝,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件围辙,死亡現(xiàn)場離奇詭異我碟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)姚建,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門怎囚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人桥胞,你說我怎么就攤上這事恳守。” “怎么了贩虾?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵催烘,是天一觀的道長。 經(jīng)常有香客問我缎罢,道長伊群,這世上最難降的妖魔是什么考杉? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮舰始,結(jié)果婚禮上崇棠,老公的妹妹穿的比我還像新娘。我一直安慰自己丸卷,他們只是感情好枕稀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谜嫉,像睡著了一般萎坷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沐兰,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天哆档,我揣著相機(jī)與錄音,去河邊找鬼住闯。 笑死瓜浸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的比原。 我是一名探鬼主播插佛,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼春寿!你這毒婦竟也來了朗涩?” 一聲冷哼從身側(cè)響起忽孽,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤绑改,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后兄一,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厘线,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年出革,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了造壮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骂束,死狀恐怖耳璧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情展箱,我是刑警寧澤旨枯,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站混驰,受9級特大地震影響攀隔,放射性物質(zhì)發(fā)生泄漏皂贩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一昆汹、第九天 我趴在偏房一處隱蔽的房頂上張望明刷。 院中可真熱鬧,春花似錦满粗、人聲如沸辈末。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽本冲。三九已至,卻和暖如春劫扒,著一層夾襖步出監(jiān)牢的瞬間檬洞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工沟饥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留添怔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓贤旷,卻偏偏與公主長得像广料,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子幼驶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法艾杏,類相關(guān)的語法,內(nèi)部類的語法盅藻,繼承相關(guān)的語法购桑,異常的語法,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • 簡介: 提供一個(gè)讓有限的窗口變成一個(gè)大數(shù)據(jù)集的靈活視圖氏淑。 術(shù)語表: Adapter:RecyclerView的子類...
    酷泡泡閱讀 5,163評論 0 16
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,089評論 25 707
  • 運(yùn)動(dòng)讓人愉悅勃蜘,運(yùn)動(dòng)是必修課,閱讀是選修課假残。如果整天閱讀缭贡,眼睛肯定受不了。如果整天運(yùn)動(dòng)辉懒,心情肯定大好阳惹。每天運(yùn)動(dòng)半小時(shí)...
    烏龜?shù)穆?/span>閱讀 227評論 0 0
  • 24.2兼容性處理 開始只能在Android5.0+系統(tǒng)上使用Vector功能,Androidgradleplug...
    xjbclz閱讀 394評論 0 0