Lateinit属性适配器尚未在Kotlin4Android中初始化

问题描述 投票:5回答:1

我在RecyclerView里面的fragment创建了activity,一切都很好但是当我从notifyDataSetChanged()通过adapteractivityinterface时,我得到一个错误“lateinit property adapter尚未初始化”但我已经initialized adapter

    class BuildingListFragment : Fragment(), MainActivity.EditInterface {


    lateinit var adapter: BuildingListAdapter

    private var mListener: OnFragmentInteractionListener? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        return inflater!!.inflate(R.layout.fragment_building_list, container, false)
    }

    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val buildingList = ArrayList<BuildingDetailModel>()

        val alphaList = arrayOf("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K",
                "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "z")
        for (i in alphaList.indices) {

            val building = BuildingDetailModel()
            building.buildingName = alphaList[i] + " Building"
            buildingList.add(building)

        }

        //initialize adapter
        adapter = BuildingListAdapter(buildingList)
        // RV_Building_List.layoutManager = LinearLayoutManager(context, LinearLayout.VERTICAL, false)
        RV_Building_List.adapter = adapter

        RV_Building_List.layoutManager = object : LinearLayoutManager(activity, LinearLayoutManager.VERTICAL, false) {
            override fun onLayoutChildren(recycler: RecyclerView.Recycler?, state: RecyclerView.State) {
                super.onLayoutChildren(recycler, state)
                //TODO if the items are filtered, considered hiding the fast scroller here
                val firstVisibleItemPosition = findFirstVisibleItemPosition()
                if (firstVisibleItemPosition != 0) {
                    // this avoids trying to handle un-needed calls
                    if (firstVisibleItemPosition == -1)
                    //not initialized, or no items shown, so hide fast-scroller
                    {
                        fastscroller.visibility = View.GONE
                    }
                    return
                }
                val lastVisibleItemPosition = findLastVisibleItemPosition()
                val itemsShown = lastVisibleItemPosition - firstVisibleItemPosition + 1
                //if all items are shown, hide the fast-scroller
                fastscroller.visibility = if (adapter.itemCount > itemsShown) View.VISIBLE else View.GONE
            }
        }
        fastscroller.setRecyclerView(RV_Building_List)
        fastscroller.setViewsToUse(R.layout.recycler_view_fast_scroller__fast_scroller, R.id.fastscroller_bubble, R.id.fastscroller_handle)

    }

    override fun editClickFromMainActivity() {
        // TODO("not implemented") //To change body of created functions use File | Settings | File Templates.

        //at this line error  is lateinit property adapter has not been initialized
        if (adapter.getIsSelected()) adapter.setIsSelected(false) else adapter.setIsSelected(true)
    }

    override fun onDetach() {
        super.onDetach()
        mListener = null
    }

    override fun onResume() {
        super.onResume()

    }

    interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        fun onFragmentInteraction(uri: Uri)
    }

    companion object {

        // TODO: Rename and change types and number of parameters
        fun newInstance(): BuildingListFragment {
            val fragment = BuildingListFragment()
            return fragment
        }
    }
}

我的主要活动

    class MainActivity : AppCompatActivity() {

    private val mOnNavigationItemSelectedListener =
            BottomNavigationView.OnNavigationItemSelectedListener { item ->
                when (item.itemId) {
                    R.id.navigation_list -> {
                        val fragment = BuildingListFragment.Companion.newInstance();
                        addFragment(fragment, R.anim.slide_re_in, R.anim.slide_re_out)
                        return@OnNavigationItemSelectedListener true
                    }
                    R.id.navigation_map -> {
                        val fragment = BuildingMapFragment.Companion.newInstance();
                        addFragment(fragment, R.anim.slide_in, R.anim.slide_out)
                        return@OnNavigationItemSelectedListener true
                    }
                }
                false
            }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)

        val fragment = BuildingListFragment.Companion.newInstance()
        addFragment(fragment, R.anim.slide_re_in, R.anim.slide_re_out)

        iv_Add.setOnClickListener {
            var intent = Intent(this, AddBuildingMapsActivity::class.java)
            startActivity(intent)
        }
        iv_edit.setOnClickListener {
            (BuildingListFragment.newInstance() as EditInterface).editClickFromMainActivity()
        }
    }


    /**
     * add/replace fragment in container [framelayout]
     */
    private fun addFragment(fragment: Fragment, slide_re_in: Int, slide_re_out: Int) {

        supportFragmentManager
                .beginTransaction()
                .setCustomAnimations(slide_re_in, slide_re_out)
                .replace(R.id.fragmentContainer, fragment, null)//fragment.javaClass.getSimpleName()
                .addToBackStack(null)//fragment.javaClass.getSimpleName()
                .commit()
    }

    override fun onBackPressed() {
        super.onBackPressed()
        Log.e("TAG", "TAG")
    }

    interface EditInterface {
        fun editClickFromMainActivity()
    }
}

请帮我解决这个问题谢谢..

android kotlin recycler-adapter kotlin-android-extensions
1个回答
2
投票

您的问题是,当您在主活动行中调用单击处理程序时,您正在创建该片段的新实例

(BuildingListFragment.newInstance() as EditInterface).editClickFromMainActivity()

您需要在当前屏幕上的实际片段实例上调用该方法。有各种方法来解决这个问题,但我认为现在最安全的方法是做类似的事情

iv_edit.setOnClickListener {
    val fragment = supportFragmentManager.findFragmentByTag(FRAGMENT_TAG) as? BuildingListFragment
    fragment?.editClickFromMainActivity()
}

虽然这意味着你必须在FRAGMENT_TAG线上用addFragment使用相同的.replace(R.id.fragmentContainer, fragment, null)FRAGMENT_TAG而不是null

© www.soinside.com 2019 - 2024. All rights reserved.