android - SearchView 出现问题,无法过滤
问题描述
尝试使用 searchview 从 recyclerview 过滤我的 json 数据。recyclerview 工作正常,我可以列出数据,单击它们并获取我想要的。但我无法过滤数据的名称。
MainActivity.kt
class MainActivity : AppCompatActivity() {
// Declare Variables
lateinit var adapter: MainAdapter
lateinit var recyclerView: RecyclerView
val studentDb = BaseDataBase(this)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.setHasFixedSize(true)
fetchJson()
}
private fun fetchJson() {
println("Attempting to FetchJson")
val url = HttpUrl.Builder()
.scheme("https")
.host("www.noforeignland.com")
.addPathSegment("home")
.addPathSegment("api")
.addPathSegment("v1")
.addPathSegment("places")
.build()
println(url)
val request = Request.Builder()
.url(url)
.cacheControl(CacheControl.Builder().noCache().build())
.build()
val client = OkHttpClient()
client.newCall(request).enqueue(object : Callback {
override fun onResponse(call: Call, response: Response) {
val body = response.body?.string()
println(body)
val gson = GsonBuilder().create()
val list = mutableListOf<Properties>()
when(response.code) {
200 ->{
Thread(Runnable {
})
}
}
val homeFeed = gson.fromJson(body, Assigment::class.java)
runOnUiThread {
adapter = MainAdapter(homeFeed)
recyclerView.adapter = adapter
}
}
override fun onFailure(call: Call, e: IOException) {
println("Failed to execute request")
}
})
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
val manager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
val searchItem = menu?.findItem(R.id.searchView2)
val searchView = searchItem?.actionView as? SearchView
searchView?.setSearchableInfo(manager.getSearchableInfo(componentName))
searchView?.setOnQueryTextListener(object: SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
return false
}
override fun onQueryTextChange(newText: String?): Boolean {
adapter.filter.filter(newText)
return true
}
})
return true
}
}
主适配器.kt
class MainAdapter(var homeFeed: Assigment) : RecyclerView.Adapter<MainAdapter.CustomViewHolder>(), Filterable {
lateinit var dataFilerList : Assigment
override fun getItemCount(): Int {
return homeFeed.features.size
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
val layoutInflater = LayoutInflater.from(parent?.context)
val cellForRow = layoutInflater.inflate(R.layout.activity_data, parent, false)
return CustomViewHolder(cellForRow)
}
override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
val model = homeFeed.features.get(position)
holder?.view?.texViewTitle?.text = model.properties.name
holder?.jsonData = model
}
class CustomViewHolder(val view: View, var jsonData: Feature? = null) : RecyclerView.ViewHolder(view) {
companion object {
val title_key = "title"
val id_key = "id"
val latitude_key = "latitude"
val longitude_key = "longitude"
}
init {
view.setOnClickListener {
val intent = Intent(view.context, CourseDetailActivity::class.java)
intent.putExtra(title_key, jsonData?.properties?.name)
intent.putExtra(id_key, jsonData?.properties?.id)
view.context.startActivity(intent)
}
view.gps_view.setOnClickListener{
val intent = Intent(view.context, MapsActivity::class.java)
intent.putExtra(title_key, jsonData?.properties?.name)
intent.putExtra(latitude_key, jsonData?.geometry?.coordinates?.last())
intent.putExtra(longitude_key, jsonData?.geometry?.coordinates?.first())
view.context.startActivity(intent)
}
}
}
override fun getFilter(): Filter {
return object : Filter() {
override fun performFiltering(charString: CharSequence?): FilterResults {
val charsearch = charString?.toString()?.toLowerCase()
if (charsearch!!.isEmpty()) {
dataFilerList = homeFeed
} else {
val resultList = ArrayList<Feature>()
for (row in homeFeed.features) {
if (row.properties.name.toLowerCase().contains(charsearch.toLowerCase())
) {
resultList.add(row)
}
}
}
val filterResult = FilterResults()
filterResult.values = dataFilerList
return filterResult
}
override fun publishResults(charSequence: CharSequence?, filterResults: FilterResults) {
dataFilerList = (filterResults.values as? Assigment)!!
notifyDataSetChanged()
}
}
}
}
分配.kt
data class Assigment(
val features: List<Feature>,
val type: String
)
我确实知道可能出了什么问题,但我对 kotlin 还是很陌生。
解决方案
看起来您的过滤结果存储在dataFilerList
. 但dataFilerList
不在适配器中的任何地方使用。
因此,与其“绑定”数据并从中获取大小homeFeed
,不如将显示的数据基于dataFilerList
.
初始化dataFilerList
为等于homeFeed
。
class MainAdapter(homeFeed: Assigment) : RecyclerView.Adapter<MainAdapter.CustomViewHolder>(), Filterable {
var dataFilerList: Assigment
init {
dataFilerList = homeFeed
}
override fun getItemCount(): Int {
return dataFilerList.features.size
}
...
override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
val model = dataFilerList.features.get(position)
holder?.view?.texViewTitle?.text = model.properties.name
holder?.jsonData = model
}
...
让我知道这是否能解决问题。
编辑:
过滤器中还有另一个问题,您没有将过滤器设置resultList
为dataFilerList
. 因此,过滤后的结果实际上丢失了。
override fun getFilter(): Filter {
return object : Filter() {
override fun performFiltering(charString: CharSequence?): FilterResults {
val charsearch = charString?.toString()?.toLowerCase()
if (charsearch!!.isEmpty()) {
dataFilerList = homeFeed
} else {
val resultList = ArrayList<Feature>()
for (row in homeFeed.features) {
if (row.properties.name.toLowerCase().contains(charsearch.toLowerCase())
) {
resultList.add(row)
}
}
dataFilerList = Assigment(resultList, homeFeed.type)
}
val filterResult = FilterResults()
filterResult.values = dataFilerList
return filterResult
}
override fun publishResults(charSequence: CharSequence?, filterResults: FilterResults) {
dataFilerList = (filterResults.values as? Assigment)!!
notifyDataSetChanged()
}
}
}
推荐阅读
- php - PHP - preg_match 或多个 HTML Lines 对象上的等效项以创建数组
- windows - 以简单的方式使用 windows 光纤但出现无法解释的错误
- css - 在 Angular 6 中访问 SCSS 中的正文语言
- azure-resource-manager - 在 ARM 部署期间尝试创建存储帐户时收到 429 错误
- python - sudo -H python2 -m pip install -U pip #更新pip
- android - 使用活动方法后Android应用程序与RabbitMQ断开连接
- reporting-services - SSRS 切换整行的可见性
- google-assistant-sdk - 下次在 Ubuntu 上安装谷歌助手时如何运行它?
- c++ - 谷歌/基准不一致的结果
- python - PyQt5 不会将设置保存到 ini 文件