读书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源码,搜索栏模糊处理实现的相关代码, 更多内容欢迎关注之后的文章

 

posted @   云豹科技-苏凌霄  阅读(92)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示