kotlin - Error lateinit property adapter has not been initialized after come back from activity
问题描述
I've a problem with this code. After adding the code for the SearchView, every time that I click on one element going to StoreActivity, when I come back I receive the error
kotlin.UninitializedPropertyAccessException: lateinit property adapter has not been initialized
on row
adapter.filter.filter(newText)
How I can resolve this error? I don't understand...
class HomeFragment : BaseFragment() {
private lateinit var adapter: MyStoreRecyclerViewAdapter
private var stores: List<StoreRealm> = ArrayList()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_home, container, false)
}
override fun onResume() {
super.onResume()
setHasOptionsMenu(true)
if (isAdded) {
val systemService = this.context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
BLocationManager(this.context).getLocation {
loadHome()
if (!systemService.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
showEnableGpsDialog()
} else {
gpsWarning.visibility = View.GONE
}
}
}
}
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
inflater?.inflate(R.menu.search_store, menu)
val search: MenuItem = menu!!.findItem(R.id.searchStore)
val searchView: SearchView = search.actionView as SearchView
search(searchView)
searchView.maxWidth = Int.MAX_VALUE
super.onCreateOptionsMenu(menu, inflater)
}
private fun loadHome() {
loading_spinner?.visibility = View.VISIBLE
StoreService.getStores(
AuthManager.getMe()?.id!!, 0, BLocationManager.lat, BLocationManager.lon
) { response ->
loading_spinner?.visibility = View.GONE
if (response.getResult() != null && response.getResult()?.isNotEmpty()!!) {
no_data_view?.visibility = View.GONE
store_view?.visibility = View.VISIBLE
stores = response.getResult()!!
// set up the RecyclerView
val recyclerView = view.store_recycler
recyclerView.layoutManager = GridLayoutManager(this.context, 1)
adapter = MyStoreRecyclerViewAdapter(stores) {
val intent = Intent(this.context, StoreActivity::class.java)
intent.putExtra("store_id", it.id)
startActivity(intent)
}
recyclerView.adapter = adapter
} else {
no_data_view?.visibility = View.VISIBLE
store_view?.visibility = View.GONE
}
if ((response.getError() as? UnknownHostException) != null) {
AuthManager.logout(this.activity)
NavigationManager.goToLogin(this.activity)
}
}
}
private fun search(searchView: SearchView) {
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
}
})
}
}
解决方案
此错误表示您在初始化适配器之前正在使用它。这可能是因为您的商店的回调是异步的。
解决此问题的一种方法是将 aMutableList
放入您的适配器并使用空列表将其初始化 onCreate:
private lateinit var adapter: MyStoreRecyclerViewAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
adapter = MyStoreRecyclerViewAdapter(mutableListOf())
recyclerView.adapter = adapter
}
然后当你的商店回调被调用时:
adapter.list = stores
另外,不要忘记在设置列表后调用notifyDataSetChanged()
,adapter
否则您的更改将不可见
推荐阅读
- google-chrome - Chrome DevTools Snippets 存储在 Chrome 90 中的什么位置?
- visual-studio - C# Listbox 将文本转换为超链接
- node.js - 节点如何通过 Segment 识别访客用户
- ios - 快进时媒体播放器不移动搜索栏
- docker - 通过 docker run 创建弹性综合监控时,无法在 Kibana 仪表板中查看监控详细信息,出现错误
- java - 当变量被赋予某个值时,Java从函数返回
- python - django admininstrator register accpetion
- python - 如何打印链接列表的评论?
- ios - 具有动态字段的 SwiftUI 观察对象
- android-studio - SMS Manager 已发送多条消息