讀書APP原始碼,搜尋欄模糊處理實現
讀書APP原始碼,搜尋欄模糊處理實現的相關程式碼
1.實現
1.1 EditText監聽部分
方法解釋:
EditText的addTextChangedListener監聽如下,可以看到共有三個方法
beforeTextChanged()
在EditText輸入前,先呼叫一次該方法
afterTextChanged()
在EditText輸入完成後,呼叫一次該方法
onTextChanged()
在EditText輸入過程中,不斷的回撥該方法
etContent.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(s: Editable?) { } override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { } })
效果實現:
我們想實現的效果有如下內容
當輸入框內有內容時則顯示刪除按鈕,沒有內容時則隱藏
在輸入過程中不斷的進行網路請求
搜尋有結果時則顯示Recyclerview,沒有資料則隱藏
具體實現:
etContent.addTextChangedListener(object : TextWatcher { ...... override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { if (etContent.text.isNullOrEmpty()) { //輸入框為空,刪除按鈕隱藏 ivDel.visibility = View.GONE //當輸入框為空時,隱藏recyclerview,目的是隱藏上一次的搜尋結果 recy.visibility = View.GONE } else { //輸入框不為空,刪除按鈕展示 ivDel.visibility = View.VISIBLE //輸入框發生變化就進行網路請求 mainViewModel.getFuzzySearchList(Const.fuzzySearchUrl,etContent.text.toString()) } } })
1.2 網路請求部分
介面部分:
模糊搜尋
@GET請求
引數:key:wd value:要搜尋的內容
地址:
使用以上介面,傳入一個引數wd即可,wd為我們輸入框的內容
interface ApiService { @GET fun getFuzzySearchList(@Url url:String,@Query("wd") content:String): Call<ResponseBody> }
詳情介面
Url為:文字框內容+&cl=3
這裡我們簡單的通過webview載入該網頁即可
邏輯部分:
請求完成後若資料為空,則要隱藏Recyclerview皮膚,反之則顯示
請求完成後對Recyclerview進行更新
2. 具體實現
MainActivity
class MainActivity : AppCompatActivity() { //建立ViewModel private val mainViewModel: MainViewModel by lazy { ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory(application)).get( MainViewModel::class.java ) } private val data = mutableListOf<String>() private val myAdapter = MyAdapter(data) override fun onCreate(savedInstanceState: Bundle?) { ... //Recyclerview相關配置 recy.layoutManager = LinearLayoutManager(this) recy.adapter = myAdapter //跳轉到詳情頁 myAdapter.setOnMyClickListener(object :MyAdapter.MyClickListener{ override fun onClick(position: Int) { val intent = Intent(this@MainActivity,NewsShowActivity::class.java) val url = Const.serchUrl+data[position]+"&cl=3" intent.putExtra("url",url) startActivity(intent) //跳轉後清空搜尋框,隱藏Recyclerview皮膚 etContent.setText("") recy.visibility = View.GONE } //模糊搜尋結果監聽 mainViewModel.getResultLiveData().observe(this, Observer { if(it.isEmpty()){ //資料為空,隱藏RecyclerView皮膚 recy.visibility = View.GONE }else{ recy.visibility = View.VISIBLE } //搜尋完成後對RecyclerView更新 data.clear() data.addAll(it) myAdapter.notifyDataSetChanged() }) //EditText搜尋框進行監聽 etContent.addTextChangedListener(object : TextWatcher { override fun afterTextChanged(s: Editable?) { } override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { } override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { if (etContent.text.isNullOrEmpty()) { ivDel.visibility = View.GONE //為空時如果不隱藏, 上一次搜尋的結果就會在下面顯示不會隱藏 recy.visibility = View.GONE } else { ivDel.visibility = View.VISIBLE //進行網路請求 mainViewModel.getFuzzySearchList(Const.fuzzySearchUrl,etContent.text.toString()) } } }) } }
MainViewModel
模糊搜尋返回的資料是如下格式,而且是GBK編碼,所以我們在請求成功後需要對資料進行下處理
window.baidu.sug({q:"奧運會",p:false,s:["奧運會","奧運會女子200米蝶泳決賽","奧運會獎牌榜","奧運會賽程","奧運會金牌榜2021","奧運會乒乓球","奧運會直播","奧運會多少年舉辦一次","奧運會在哪看","奧運會裁判"]}); 1 class MainViewModel :ViewModel(){ private val httpClient = OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) .readTimeout(5, TimeUnit.SECONDS) .writeTimeout(5, TimeUnit.SECONDS) .build() private val retrofit: Retrofit =Retrofit.Builder() .baseUrl(") .client(httpClient) .addConverterFactory(GsonConverterFactory.create()) .build() private val api = retrofit.create(ApiService::class.java) /** * 模糊搜尋 */ fun getFuzzySearchList(url:String,content:String){ api.getFuzzySearchList(url,content).enqueue(object : retrofit2.Callback<ResponseBody> { override fun onFailure(call: Call<ResponseBody>, t: Throwable) { errorLiveData.value = t.message } override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) { if(response?.body() != null){ //因為模糊搜尋的結果是GBK編碼,所以這裡需要處理下 val charset = response.body()!!.contentType()!!.charset()!! val source = response?.body()?.source() source?.let { source.skip(ByteString.decodeHex("efbbbf").size().toLong()) } val string = response?.body()?.string() string?.let { val startIndex = it.indexOf("(") val endIndex = it.length-2 //擷取 val json = it.substring(startIndex+1, endIndex) val jsonObject = gson.fromJson<ResultBean>(json, ResultBean::class.java) //對資料進行更新 resultLiveData.value = jsonObject.s } } } }) } }
以上就是讀書APP原始碼,搜尋欄模糊處理實現的相關程式碼, 更多內容歡迎關注之後的文章
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69978258/viewspace-2845125/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何使用QCompleter和QLineEdit實現支援模糊匹配的搜尋欄
- 小程式雲開發模糊查詢,實現資料庫多欄位的模糊搜尋資料庫
- 直播軟體開發,實現模糊搜尋的程式碼分析
- UI自動化測試:App的WebView頁面中,當搜尋欄無搜尋按鈕時處理方法UIAPPWebView
- 直播app原始碼,預設顯示搜尋框 保留搜尋條件APP原始碼
- FuzzyScore與模糊搜尋
- 【搜尋引擎】 PostgreSQL 10 實時全文檢索和分詞、相似搜尋、模糊匹配實現類似Google搜尋自動提示SQL分詞Go
- [WPF] 離線環境實現支援拼音模糊搜尋的AutoCompleteBox
- 直播開發app,實時搜尋、搜尋引擎框APP
- 成品直播原始碼,實現在平臺內部的搜尋原始碼
- 短影片app原始碼,Flutter元件--搜尋頁面佈局APP原始碼Flutter元件
- Vim模糊檔案搜尋fzf
- 扁平樹狀資料處理及多層關鍵字搜尋實現
- 線上直播系統原始碼,vue實現搜尋文字高亮功能原始碼Vue
- 搜尋 伺服器處理請求伺服器
- 視訊直播原始碼,實現本地儲存搜尋歷史記錄原始碼
- Spring原始碼解讀之BeanFactoryPostProcessor的處理Spring原始碼Bean
- Flutter 搜尋建議欄Flutter
- python 寫的搜尋引擎 - 原始碼Python原始碼
- 後處理 - 均值模糊
- 後處理 - 高斯模糊
- Axios 原始碼解讀 —— 原始碼實現篇iOS原始碼
- 基於ArkUI框架開發——圖片模糊處理的實現UI框架
- 影片直播系統原始碼,非同步處理實現程式碼分析原始碼非同步
- layui 下拉框搜尋及程式碼實現UI
- 使用APICloud AVM多端元件快速實現app中的搜尋功能APICloud元件APP
- win10自帶搜尋欄如何關閉 win10取消搜尋欄Win10
- 線上直播系統原始碼,實現搜尋後介面顯示商品列表效果原始碼
- 豆瓣讀書搜尋頁的window.__DATA__的解密解密
- Elasticsearch 實現簡單搜尋Elasticsearch
- Laravel + Elasticsearch 實現中文搜尋LaravelElasticsearch
- Jquery + Bootstrap 實現搜尋框jQueryboot
- PostgreSQL 原始碼解讀(225)- Transaction(子事務處理)SQL原始碼
- mongodb核心原始碼實現、效能調優、最佳運維實踐系列-command命令處理模組原始碼實現一MongoDB原始碼運維
- mongodb核心原始碼實現、效能調優、最佳運維實踐系列-command命令處理模組原始碼實現三MongoDB原始碼運維
- mongodb核心原始碼實現、效能調優、最佳運維實踐系列-command命令處理模組原始碼實現二MongoDB原始碼運維
- MacOS的Safari搜尋欄無法搜尋怎麼解決?Mac
- MySQL簡單實現多欄位模糊查詢MySql