读书APP源码,搜索栏模糊处理实现
读书APP源码,搜索栏模糊处理实现的相关代码
1.实现
1.1 EditText监听部分
方法解释:
EditText的addTextChangedListener监听如下,可以看到共有三个方法
1 | beforeTextChanged() |
在EditText输入前,先调用一次该方法
1 | afterTextChanged() |
在EditText输入完成后,调用一次该方法
1 | onTextChanged() |
在EditText输入过程中,不断的回调该方法
1 | etContent.addTextChangedListener(object : TextWatcher {<br> <br> override fun afterTextChanged(s: Editable?) {<br> }<br> override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {<br> }<br> override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {<br> }<br>}) |
效果实现:
我们想实现的效果有如下内容
当输入框内有内容时则显示删除按钮,没有内容时则隐藏
在输入过程中不断的进行网络请求
搜索有结果时则显示Recyclerview,没有数据则隐藏
具体实现:
1 | etContent.addTextChangedListener(object : TextWatcher { <br> ......<br> override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { <br> if (etContent.text.isNullOrEmpty()) {<br> //输入框为空,删除按钮隐藏<br> ivDel.visibility = View.GONE<br> //当输入框为空时,隐藏recyclerview,目的是隐藏上一次的搜索结果<br> recy.visibility = View.GONE<br> } else {<br>//输入框不为空,删除按钮展示<br> ivDel.visibility = View.VISIBLE <br> //输入框发生变化就进行网络请求 <br> mainViewModel.getFuzzySearchList(Const.fuzzySearchUrl,etContent.text.toString())<br> }<br> }<br>}) |
1.2 网络请求部分
接口部分:
模糊搜索
@GET请求
参数:key:wd value:要搜索的内容
地址:https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su
使用以上接口,传入一个参数wd即可,wd为我们输入框的内容
1 | interface ApiService {<br> @GET <br>fun getFuzzySearchList( @Url url:String, @Query ( "wd" ) content:String): Call<ResponseBody><br>} |
详情接口
Url为:http://www.baidu.com.cn/s?wd=+文本框内容+&cl=3
这里我们简单的通过webview加载该网页即可
逻辑部分:
请求完成后若数据为空,则要隐藏Recyclerview面板,反之则显示
请求完成后对Recyclerview进行更新
2. 具体实现
MainActivity
1 | class MainActivity : AppCompatActivity() {<br> <br> //创建ViewModel<br> private val mainViewModel: MainViewModel by lazy {<br> ViewModelProvider(this, ViewModelProvider.AndroidViewModelFactory(application)).get(<br> MainViewModel::class.java<br> )<br> }<br> private val data = mutableListOf<String>()<br> private val myAdapter = MyAdapter(data)<br> override fun onCreate(savedInstanceState: Bundle?) {<br> ...<br> //Recyclerview相关配置<br> recy.layoutManager = LinearLayoutManager(this)<br> recy.adapter = myAdapter<br> //跳转到详情页<br> myAdapter.setOnMyClickListener(object :MyAdapter.MyClickListener{<br> override fun onClick(position: Int) {<br> val intent = Intent(this@MainActivity,NewsShowActivity::class.java)<br> val url = Const.serchUrl+data[position]+"&cl=3"<br> intent.putExtra("url",url)<br> startActivity(intent)<br> //跳转后清空搜索框,隐藏Recyclerview面板<br> etContent.setText("")<br> recy.visibility = View.GONE<br> <br> }<br> //模糊搜索结果监听<br> mainViewModel.getResultLiveData().observe(this, Observer {<br> if(it.isEmpty()){<br> //数据为空,隐藏RecyclerView面板<br> recy.visibility = View.GONE<br> }else{<br> recy.visibility = View.VISIBLE<br> }<br> //搜索完成后对RecyclerView更新<br> data.clear()<br> data.addAll(it)<br> myAdapter.notifyDataSetChanged() <br> })<br> <br> //EditText搜索框进行监听 <br> etContent.addTextChangedListener(object : TextWatcher {<br> override fun afterTextChanged(s: Editable?) { <br> }<br> override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { <br> }<br> override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {<br> if (etContent.text.isNullOrEmpty()) {<br> ivDel.visibility = View.GONE<br> //为空时如果不隐藏, 上一次搜索的结果就会在下面显示不会隐藏<br> recy.visibility = View.GONE<br> } else {<br> ivDel.visibility = View.VISIBLE <br> //进行网络请求<br> mainViewModel.getFuzzySearchList(Const.fuzzySearchUrl,etContent.text.toString())<br> }<br> }<br> })<br> }<br>} |
MainViewModel
模糊搜索返回的数据是如下格式,而且是GBK编码,所以我们在请求成功后需要对数据进行下处理
1 | window.baidu.sug({q: "奥运会" ,p: false ,s:[ "奥运会" , "奥运会女子200米蝶泳决赛" , "奥运会奖牌榜" , "奥运会赛程" , "奥运会金牌榜2021" , "奥运会乒乓球" , "奥运会直播" , "奥运会多少年举办一次" , "奥运会在哪看" , "奥运会裁判" ]});<br> 1 <br> class MainViewModel :ViewModel(){<br> <br> private val httpClient = OkHttpClient.Builder()<br> .connectTimeout( 5 , TimeUnit.SECONDS)<br> .readTimeout( 5 , TimeUnit.SECONDS)<br> .writeTimeout( 5 , TimeUnit.SECONDS)<br> .build()<br> private val retrofit: Retrofit =Retrofit.Builder()<br> .baseUrl( "http://a" )<br> .client(httpClient)<br> .addConverterFactory(GsonConverterFactory.create())<br> .build()<br> private val api = retrofit.create(ApiService:: class .java)<br> <br> <br> /**<br> * 模糊搜索<br> */ <br> fun getFuzzySearchList(url:String,content:String){<br> api.getFuzzySearchList(url,content).enqueue(object : retrofit2.Callback<ResponseBody> {<br> override fun onFailure(call: Call<ResponseBody>, t: Throwable) {<br> errorLiveData.value = t.message<br> }<br> override fun onResponse(call: Call<ResponseBody>, response: Response<ResponseBody>) {<br> if (response?.body() != null ){<br> //因为模糊搜索的结果是GBK编码,所以这里需要处理下<br> val charset = response.body()!!.contentType()!!.charset()!!<br> val source = response?.body()?.source()<br> source?.let { <br> source.skip(ByteString.decodeHex( "efbbbf" ).size().toLong())<br> }<br> <br> val string = response?.body()?.string()<br> string?.let {<br> val startIndex = it.indexOf( "(" )<br> val endIndex = it.length- 2 <br> //截取<br> val json = it.substring(startIndex+ 1 , endIndex)<br> val jsonObject = gson.fromJson<ResultBean>(json, ResultBean:: class .java)<br> //对数据进行更新<br> resultLiveData.value = jsonObject.s<br> }<br> }<br> }<br> })<br> } <br>} |
以上就是读书APP源码,搜索栏模糊处理实现的相关代码, 更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现