首页 > 编程知识 正文

安卓怎么实现搜索的代码,Android设置搜索

时间:2023-05-03 17:10:18 阅读:169276 作者:701

1 .前言最近的项目需要模糊搜索的功能。 一开始我觉得很难,但仔细想想,什么都没有。 具体的模糊搜索部分由后端提供接口,但只需在搜索框内容发生变化时执行一次搜索功能。

2 .效果图可见

文本框在输入时没有实时搜索结果的情况下,底部的结果表明直接隐藏茅台并不牢固… 3 .在思路搜索框部分使用EditText,通过addTextChangedListener方法对其进行拦截

界面部分,这里使用百度界面,通过Retrofit2轻松实现网络请求

模糊搜索结果的展示部分,我用Recyclerview实现模糊搜索结果的展示

4.1 EditText监听部分方法解释的实现: EditText的addTextChangedListener监听如下,共有3种方法

beforeTextChanged (

在输入EditText之前,请调用一次此方法

afterTextChanged (

输入EditText后,调用一次此方法

onTextChanged (

在输入EditText时,不断的回调调用此方法

et content.addtextchangedlistener (object : text watcher ) overridefunaftertextchanged ) s:editable? { } overridefunbeforetextchanged (s : char sequence?start: Int,count: Int,after: Int ) { } overridefunontextchanged (s : char sequence?start: Int、before: Int、count: Int ) { }效果的实现:我们希望实现的效果如下

如果输入框中有内容,则显示删除按钮,如果没有内容,则隐藏在输入过程中,不断搜索网络请求,如果有结果,则显示Recyclerview,如果没有数据,则隐藏具体实现。 et content.addtextchangedlistener (. object 3360 text watcher )。开始: int,before: Int, count: Int ) { et content.text.isnullorempty () /输入框为空,删除按钮隐藏iv del.visibity }隐藏recyclerview else{//输入框不为空,删除按钮iv del.visibility=view.visible//输入框发生更改时,网络请求main viewmodel.getfuzzysearchlisysearchlise

@GET请求

参数: key:wd value :要搜索的内容

地址: https://sp0.Baidu.com/5a1fa zu8 aa 54 nxg ko9WTA nf 6h hy/su

使用上述界面,输入参数wd即可。 wd是我们输入框的内容

interfaceapiservice { @ getfungetfuzzysearchlist (@ URL URL : string,@query ) content:String ) 3360callrespring

Url是http://www.baidu.com.cn/s? wd=文本框内容cl=3

在这里简单地用webview加载这个页面就可以了

逻辑部分:如果请求完成后数据为空,则隐藏Recyclerview面板。 相反,表示请求完成后更新Recyclerview.具体实现模糊搜索

创建类: appcompatactivity//viewmodelprivatevalmainviewmodel 3360 mainviewmodelbylazy { viewmodelp }

rovider(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","奥运会乒乓球","奥运会直播","奥运会多少年举办一次","奥运会在哪看","奥运会裁判"]}); 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("http://a") .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 } } } }) } } 6. 总结

以上就是全部内容,其实也挺简单的,我们这边其实就是对EditText监听,然后对网络请求的结果进行处理就可以了,其余部分的逻辑就是什么时候显示与隐藏的事情。

如果本文对你有帮助,请别忘记三连,如果有不恰当的地方也请提出来,下篇文章见。

7. 参考文章

百度模糊查询_三番鱼-CSDN博客

调用百度搜索接口查询_greatmind829的专栏-CSDN博客

⭐android retrofit 请求返回String数据中文乱码解决方案

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。