Android Studio中Fragment视图未随SearchView搜索数据更新
问题解决:SearchView搜索后RecyclerView不更新
问题根源
你已经通过Log确认搜索接口返回了正确的数据,但RecyclerView未更新,核心原因是获取到搜索结果后,没有调用Adapter的setData方法将新数据传递给列表。
具体修改
修改TripHome中的getItemsFromDb方法,在数据回调中添加更新Adapter的逻辑,同时将Observer的生命周期所有者替换为viewLifecycleOwner(更安全,避免Fragment销毁后内存泄漏):
private fun getItemsFromDb(searchText: String) { var searchText = searchText searchText = "%$searchText%" mTripViewModel.searchTrip(query = searchText).observe(viewLifecycleOwner, Observer { trip-> trip?.let { Log.e("List = ", trip.toString()) // 新增:将搜索结果传递给Adapter更新视图 adapter.setData(it) } }) }
额外优化建议(可选)
如果你的TripViewModel中searchTrip方法每次调用都会创建新的LiveData实例,建议使用Transformations.switchMap来实现搜索结果的自动响应,避免重复创建Observer:
// 在TripViewModel中 private val searchQuery = MutableLiveData<String>() val searchResults: LiveData<List<TripModel>> = Transformations.switchMap(searchQuery) { query -> repository.searchTrip(query) // 这里替换为你的搜索数据源逻辑 } fun setSearchQuery(query: String) { searchQuery.value = "%$query%" }
然后在Fragment中只需要观察一次searchResults:
// 在onCreateView中 mTripViewModel.searchResults.observe(viewLifecycleOwner, Observer { adapter.setData(it) }) // 修改getItemsFromDb private fun getItemsFromDb(searchText: String) { mTripViewModel.setSearchQuery(searchText) }
验证
修改完成后,再次输入搜索文本,Log显示正确数据的同时,RecyclerView会自动刷新展示过滤后的内容。
内容的提问来源于stack exchange,提问作者VDTVN
相关产品推荐
相关产品推荐

