【问题标题】:Error lateinit property adapter has not been initialized after come back from activity从活动返回后,错误lateinit属性适配器尚未初始化
【发布时间】:2019-03-10 11:34:53
【问题描述】:

我对这段代码有疑问。添加 SearchView 的代码后,每次我点击一个进入 StoreActivity 的元素时,当我回来时,我都会收到错误

kotlin.UninitializedPropertyAccessException:lateinit 属性适配器尚未初始化

在行

adapter.filter.filter(newText)

如何解决此错误?没看懂……

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
            }

        })
    }
}

【问题讨论】:

    标签: kotlin adapter searchview


    【解决方案1】:

    此错误表示您在初始化适配器之前正在使用它。这里可能是因为你的 store 的回调是异步的。

    解决此问题的一种方法是在您的适配器中放置一个MutableList 并使用一个空列表对其进行 onCreate 初始化:

    private lateinit var adapter: MyStoreRecyclerViewAdapter
    
    
    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            adapter = MyStoreRecyclerViewAdapter(mutableListOf())
            recyclerView.adapter = adapter
    }
    

    那么当你的 Store 回调被调用时:

    adapter.list = stores
    

    另外,不要忘记在设置列表后在adapter 上调用notifyDataSetChanged(),否则您的更改将不可见

    【讨论】:

    • 我不明白在哪里调用 notifyDataSetChanged()。
    • 更新适配器列表后写: ///// adapter.list = stores ; adapter.notifyDataSetChanged() ///// 这告诉 RecyclerView 重新绘制适配器中的所有项目
    • 它可以工作,但是当我点击项目然后返回搜索文本时仍然存在。可以去掉吗?
    • 抱歉,我不确定您的意思,您能具体一点吗?如果你想清除和EditText,你可以在startActivity之前调用yourEditText.text = ""
    【解决方案2】:

    而且,如果您不想要 mutableList,只需初始化您的 ArrayList&lt;&gt;

    private lateinit var arrayList: ArrayList<String>
    

    作为

    bluetoothDevices = arrayListOf()
    

    onCreate() 方法中,在将其附加到Adapter 之前

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 2020-06-08
      • 2020-12-31
      • 2021-06-11
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多