日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Android Filterable實現(xiàn)Recyclerview篩選功能的示例代碼

瀏覽:32日期:2022-09-20 18:44:48

原先碰到篩選這種功能時,后端的接口都會讓上傳一個字段,根據(jù)字段來返回相應(yīng)的數(shù)據(jù)。后來一次和別人對接時,接口直接返回全部數(shù)據(jù),而且還要實現(xiàn)篩選功能。我...我說不就是一條sql語句的事,改接口多方便,我苦心勸導(dǎo),然后被懟回來,切,不就是篩選嘛,求人不如自己搞。

1. 效果圖

Android Filterable實現(xiàn)Recyclerview篩選功能的示例代碼

2. 思路

既然是篩選,那就少不了比較。也沒有什么好的辦法,無非就是循環(huán)對比,然后將適配器進(jìn)行數(shù)據(jù)更新。頁面刷新即可。但篩選的調(diào)用要方便,怎么比較才方便我們調(diào)用呢?偶然間看到了Filterable,使Adapter繼承自該接口,實現(xiàn)getFilter()方法,在該方法里實現(xiàn)具體的過濾邏輯即可。

3. 實現(xiàn)步驟3.1 數(shù)據(jù)Bean類

class MyBean(var type:String,var name:String,var deliverType:String)

這里我們簡單的創(chuàng)建個數(shù)據(jù)Bean類,后面我們的篩選字段是根據(jù)type和deliverType來進(jìn)行篩選。

3.2 創(chuàng)建適配器

class MyAdapter(data: MutableList<MyBean>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>(), Filterable { //存放原數(shù)據(jù) private var mSourceList = mutableListOf<MyBean>() //存放過濾后的數(shù)據(jù) private var mFilterList = mutableListOf<MyBean>() init { mSourceList = data } override fun onBindViewHolder(holder: MyViewHolder, position: Int) { holder.name.text = mFilterList[position].name holder.deliverType.text = mFilterList[position].deliverType } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { var view = LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false) return MyViewHolder(view) } /** * 注意:這里返回過濾后的集合大小 */ override fun getItemCount(): Int { return mFilterList.size } inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { //商品名稱 var name: TextView = itemView.findViewById(R.id.tvName) //配送方式 var deliverType: TextView = itemView.findViewById(R.id.tvDeliverType) }}

和我們平時創(chuàng)建的Adapter沒什么兩樣。但要注意以下幾點

1、這里我們創(chuàng)建了兩個集合mSourceList和mFilterList,mFilterList主要是用來存放過濾后的數(shù)據(jù),而mSourceList主要是用來在篩選后數(shù)據(jù)恢復(fù)時使用,使得不用再去請求一次數(shù)據(jù)。

2、getItemCount()方法返回過濾后的集合的大小。

有個疑問:假如我們沒有進(jìn)行過濾,而因為我們的mFilterList默認(rèn)為空,且getItemCount()返回的是它的大小0,那我們默認(rèn)是不是就顯示不出數(shù)據(jù)?

3.3 繼承Filterable接口

1、繼承Filterable接口后,實現(xiàn)其getFilter()方法,該方法需要我們返回一個Filter過濾器對象。

2、我們重寫Filter的performFiltering()方法和publishResults()方法,performFiltering()用來實現(xiàn)我們具體過濾的邏輯操作,publishResults()用來將我們過濾后的數(shù)據(jù)進(jìn)行更新。

3、因為performFiltering()傳來的過濾條件是一段字符串,而我們的過濾條件有兩個,所以我們將過濾的條件轉(zhuǎn)化為Json對象傳過來,那樣就可以得到多個過濾條件的字符串了。

4、這里我們的具體過濾操作是使用Collection的filter()方法進(jìn)行過濾

(1)當(dāng)condition1和condition2為空時,返回原數(shù)據(jù)mSourceList

(2)否則使用filter()方法按條件進(jìn)行過濾,最后將過濾后的集合賦值給FilterResults()對象的value字段,并將其返回

5、publishResults(charSequence: CharSequence,filterResults: FilterResults)方法中filterResults對象內(nèi)的value字段是我們performFiltering()方法返回的過濾后的集合,在這里我們將RecyclerView進(jìn)行更新。

具體實現(xiàn)見以下代碼:

class MyAdapter(data: MutableList<MyBean>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>(), Filterable { /** * 具體的執(zhí)行過濾的操作 * 創(chuàng)建適配器后會默認(rèn)的執(zhí)行一次 */ override fun getFilter(): Filter { return object : Filter() { //執(zhí)行過濾操作 override fun performFiltering(charSequence: CharSequence): FilterResults { val charString = charSequence.toString() Log.i(TAG, 'performFiltering: 執(zhí)行過濾操作,過濾字段為:$charString') val jsonObject = JSONObject(charString) //篩選條件一 var condition1 = jsonObject.getString('condition1') //篩選條件二 var condition2 = jsonObject.getString('condition2') //存放已過濾的數(shù)據(jù) var theFilterList = if (condition1.isEmpty() && condition2.isEmpty()) { //沒有過濾的內(nèi)容,則使用源數(shù)據(jù) mSourceList } else if (condition2.isEmpty()) { mSourceList.filter { it.type == condition1 } } else if (condition1.isEmpty()) { mSourceList.filter { it.deliverType == condition2 } } else { mSourceList.filter { it.type == condition1 && it.deliverType == condition2 } } val filterResults = FilterResults() filterResults.values = theFilterList return filterResults } //把過濾后的值返回出來并進(jìn)行更新 override fun publishResults( charSequence: CharSequence, filterResults: FilterResults ) { mFilterList = filterResults.values as MutableList<MyBean> notifyDataSetChanged() } } }}3.4 過濾調(diào)用

class MainActivity : AppCompatActivity() { //過濾條件1 var condition1 = '' //過濾條件2 var condition2 = '' //總的過濾條件 var jsonObject = JSONObject() private var dataList = mutableListOf<MyBean>() var myAdapter = MyAdapter(dataList) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mRecyclerView.layoutManager = LinearLayoutManager(this) mRecyclerView.adapter = myAdapter jsonObject.put('condition1','過濾條件一') jsonObject.put('condition2','過濾條件二') myAdapter.filter.filter(jsonObject.toString()) }}

如果想恢復(fù)數(shù)據(jù)不篩選,直接將jsonObject對象內(nèi)的condition1和condition2字段設(shè)為空,然后調(diào)用myAdapter.filter.filter(jsonObject.toString())即可。

具體見代碼

4. 優(yōu)化

其實我們getFilter()內(nèi)的過濾操作還可以優(yōu)化下

var theFilterList = if (condition1.isEmpty() && condition2.isEmpty()) { //沒有過濾的內(nèi)容,則使用源數(shù)據(jù) mSourceList} else if (condition2.isEmpty()) { mSourceList.filter { it.type == condition1 }} else if (condition1.isEmpty()) { mSourceList.filter { it.deliverType == condition2 }} else { mSourceList.filter { it.type == condition1 && it.deliverType == condition2 }}

可以看到else{}下是當(dāng)condition1和condition2都不為空的情況下進(jìn)行的篩選,但是如果我們使用下拉框進(jìn)行篩選時,選擇第一個條件condition1后就已經(jīng)進(jìn)行了一次篩選,即condition1不為空condition2為空,在 else if (condition2.isEmpty()){} 里對源數(shù)據(jù)進(jìn)行了篩選;再選擇第二個條件時,又進(jìn)行了一次篩選,即condition1不為空condition2不為空,在else{}里又是對源數(shù)據(jù)進(jìn)行篩選,其實我們應(yīng)該是在第一次的結(jié)果下進(jìn)行篩選是最優(yōu)的辦法。

想法很好,但實現(xiàn)起來困難挺多,在兩個條件都不為空時,我們需要判斷第一次刪選下來的數(shù)據(jù)是以哪個篩選條件為依據(jù)的,在兩個條件都不為空篩選后,再次更改其中一個篩選條件,我們需要先將另外一個篩選條件下的數(shù)據(jù)給篩選出來,越來越麻煩,暫時不考慮了,有好的方案的麻煩給個思路。

5. 注意

因為Adapter默認(rèn)返回的大小是篩選后的尺寸,而我們默認(rèn)是沒有篩選的,導(dǎo)致上來會沒有數(shù)據(jù),所以我們需要設(shè)置適配器后,人為的調(diào)用一下篩選才好:myAdapter.filter.filter(jsonObject.toString())。而我在項目中沒有寫因為AppCompatSpinner會默認(rèn)的選擇第0項,我在其onItemSelected()回調(diào)里調(diào)用了篩選功能。

6. 總結(jié)

總的來說并不難,還是更新數(shù)據(jù)更新布局的那一套,不同的是用了Filterable接口實現(xiàn),使得篩選調(diào)用的方式更簡單。但是這種實現(xiàn)更多的是適用于數(shù)據(jù)量小或者固定的數(shù)據(jù),如果數(shù)據(jù)量大,或者數(shù)據(jù)會一直上拉加載擴(kuò)充,使用這種方式只會讓效率隨著數(shù)據(jù)量的增大而越來越低,顯然不合適,下次后端還強硬不改,那就只能開懟了。Github項目地址 https://github.com/myfittinglife/RecyclerViewFilterable

7. 參考文章

集合過濾操作 Google文檔

到此這篇關(guān)于Android Filterable實現(xiàn)Recyclerview篩選功能的示例代碼的文章就介紹到這了,更多相關(guān)Android Recyclerview篩選內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久a爱视频| 婷婷久久免费视频| 蜜桃一区二区三区在线| 久久精选视频| 亚洲精品国产嫩草在线观看 | 免费人成在线不卡| 欧美日韩精品在线一区| 日韩久久电影| 亚洲成人va| 捆绑调教日本一区二区三区| 久久影视三级福利片| 欧美激情网址| 日本不卡免费高清视频在线| 日韩免费视频| 婷婷亚洲五月色综合| 婷婷成人基地| 日韩**一区毛片| 国产精品香蕉| 亚洲精品在线影院| 在线国产一区二区| 视频一区日韩精品| 国产精品毛片视频| 国模精品一区| 99精品小视频| 亚洲综合日韩| 91成人小视频| 99久久久久国产精品| 久久福利一区| 免费看一区二区三区| 欧美色图国产精品| 日韩亚洲精品在线观看| 久久精品一区| 亚洲激情不卡| 国产精品亚洲综合久久| 中文另类视频| 欧美日韩网址| 久久久久美女| 国产精品香蕉| 亚洲免费精品| 国产精品香蕉| 99在线精品免费视频九九视 | 亚洲综合欧美| 精品国产美女a久久9999| 狠狠爱www人成狠狠爱综合网| 日本aⅴ亚洲精品中文乱码| 91精品国产乱码久久久久久久| 日本vs亚洲vs韩国一区三区二区| 久久中文欧美| 国产福利亚洲| 亚洲综合三区| 久久高清一区| 成人一二三区| 人人精品人人爱| 日韩国产一区| 色欧美自拍视频| 国产精品视频一区视频二区| 午夜av一区| 亚洲日本网址| 日本在线高清| 成人台湾亚洲精品一区二区| 日韩av一区二区三区| 欧美+亚洲+精品+三区| 国产精品伊人| 国产欧美三级| 国产一卡不卡| 久久激情五月婷婷| 日本一区中文字幕| 六月丁香综合| 天堂成人国产精品一区| 国产视频一区在线观看一区免费| 日韩精品网站| 欧美亚洲国产激情| 精品一区在线| 老司机精品久久| 中文字幕av一区二区三区人| 午夜一级久久| 午夜久久av| 国产乱人伦精品一区| 欧美国产专区| 97在线精品| 97国产精品| 99热国内精品| 99热国内精品| 人人精品人人爱| 欧美亚洲tv| 精品久久中文| 国产综合亚洲精品一区二| 亚洲欧美高清| 国产九一精品| 成人日韩精品| 日本不卡中文字幕| 欧美激情三区| 欧美日中文字幕| 日本一不卡视频| 日本在线啊啊| 亚洲天堂免费| 国产一区二区亚洲| 久久亚洲国产| 欧美日韩a区| 国产综合亚洲精品一区二| 日韩高清在线不卡| 国产精品国产一区| 亚洲一区二区免费看| 国产精品黄网站| 亚洲激情黄色| 日韩国产在线| 中文字幕成人| 国产精品亚洲一区二区三区在线观看| 精品中文字幕一区二区三区av| 久久国产婷婷国产香蕉| 亚洲高清影视| 国产aⅴ精品一区二区三区久久| 久久精品欧美一区| 久久国内精品自在自线400部| 午夜精品一区二区三区国产| 国产精品v亚洲精品v日韩精品 | 国产视频一区三区| 精品久久国产一区| 亚洲精一区二区三区| 欧美sss在线视频| 免费一级欧美在线观看视频| 免费在线观看日韩欧美| 久久精品观看| 国内精品伊人| 国产麻豆一区二区三区| 亚洲欧洲av| 性欧美videohd高精| 国产精品永久| 日韩福利视频网| 中文字幕亚洲影视| 在线一区免费| 欧美日韩国产在线观看网站 | 欧美日韩在线观看首页| 国产精品天堂蜜av在线播放| 亚洲精品乱码日韩| 午夜在线精品偷拍| 久久国产精品亚洲77777| 欧美日韩国产一区精品一区| 久久国产日本精品| 成人精品高清在线视频| 久久精品系列| 成人片免费看| 色婷婷精品视频| 黄页网站一区| 亚洲精品自拍| 国产精品久久久久久久久久齐齐 | 美女视频一区在线观看| 麻豆国产精品| 久久久久久夜| 香蕉久久99| 免费成人在线影院| 日韩国产欧美视频| 久久伊人亚洲| 免费高潮视频95在线观看网站| 日韩欧美综合| 久久亚洲色图| 国产精品一区二区av日韩在线| 久久av资源| 欧美成人高清| 日本特黄久久久高潮| 精品久久91| 成人午夜精品| 免费人成在线不卡| 久久精品国产福利| 在线精品小视频| 国产精品成人自拍| 亚洲二区在线| 国产日韩中文在线中文字幕| 国产粉嫩在线观看| 视频在线观看91| 麻豆网站免费在线观看| 中文字幕乱码亚洲无线精品一区| 男女性色大片免费观看一区二区| 91亚洲无吗| 亚洲黑丝一区二区| 国产精品地址| 亚洲调教视频在线观看| 国产探花一区| 久久国产精品99国产| 麻豆视频久久| 久久av一区| 久久精品亚洲人成影院| 国产精品亚洲欧美一级在线| 亚洲综合二区| 亚洲精品小说| 国产综合色区在线观看| 精品国产中文字幕第一页| 一区二区三区网站| 欧洲激情综合| 极品日韩av| 亚洲成人精品| 久久久男人天堂| 久久伊人亚洲| 精品视频久久| 国产suv精品一区二区四区视频| 久久精品xxxxx| 国产视频一区二区在线播放| 亚洲精选av| 91九色综合| 欧美一区二区三区久久|