【问题标题】:Property not being initalized sometimes属性有时没有被初始化
【发布时间】:2020-02-13 10:30:16
【问题描述】:

我正在尝试在 FragmentPagerAdapter 中处理片段点击,但有时我会遇到致命异常:kotlin.UninitializedPropertyAccessException,它表示点击侦听器属性未初始化。

这是 PagerAdapter 的代码

class ApplicationListPagerAdapter(
    fm: FragmentManager,
    private val onListItemClick: (isSent: Boolean, application: Application) -> Unit,
    private val onGoToScholarshipsTabClicked: () -> Unit,
    private val onGoToPicksTabClicked: () -> Unit
): FragmentPagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT),
    ApplicationListFragment.ClickListener {

    override fun getCount(): Int {
        return  2
    }

    override fun getItem(position: Int): Fragment {
        val isSent = position == 1
        val fragment = ApplicationListFragment.newInstance(isSent)
        fragment.setApplicationSelectListener(this)

        return fragment
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return if (position == 0) "PICKS" else "SENT"
    }

    override fun applicationSelected(isSent: Boolean, application: Application) {
        onListItemClick(isSent, application)
    }

    override fun goToScholarshipsTabClicked() {
        onGoToScholarshipsTabClicked()
    }

    override fun goToPicksTabClicked() {
        onGoToPicksTabClicked()
    }
}

代码我如何在片段中初始化它

private lateinit var clickListener: ClickListener

fun setApplicationSelectListener(clickListener: ClickListener) {
        this.clickListener = clickListener
}

interface ClickListener {

        fun applicationSelected(isSent: Boolean, application: Application)
        fun goToScholarshipsTabClicked()
        fun goToPicksTabClicked()
}

onClick 回调中,某些用户有时会崩溃。

private fun initRecyclerView(applications: List<Application>) {
        application_list_recyclerView.adapter = ApplicationListItemsAdapter(
            context!!,
            applications.toMutableList(),
            isSent,
            this,
            applicationViewModel.applicationService,
            onClick = {
                clickListener.applicationSelected(isSent, it)
            },
            onDelete = { application: Application, count: Int  ->
                scholarshipViewModel.unFavoriteScholarship(application.scholarship)
                sharedViewModel.deletePickedScholarship(application.scholarship)
                applicationSharedViewModel.updatePicksCount(count)

                if (count == 0) {
                    showNoApplicationsFragment()
                }
            },
            onUndoDelete = { application: Application, count: Int ->
                sharedViewModel.undoDeletedScholarship(application.scholarship)
                applicationSharedViewModel.updatePicksCount(count)

                if (count == 1) {
                    hideNoApplicationsFragment()
                }
            }
        )

        application_list_recyclerView.layoutManager = LinearLayoutManager(context!!)
    }

感谢您的任何建议,我希望我的解释对每个人都有意义

【问题讨论】:

    标签: android kotlin crash


    【解决方案1】:

    界面

    interface OnItemClickListener {
    //just a random method
    fun itemClicked(positon: Int)
    }
    

    在您的 Adapter 类中

    private lateinit var listener: OnItemClickListener
    fun attachListener(listener: OnItemClickListener){
    this.listener = listener
    }
    

    活动/片段

    class MainActivity(): AppCompatActivity(), OnItemClickListener{
    // implement interface in case you wanna use methods... 
    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_chat)
    
          // calling the listener method
          myAdapter.attachListener(this)
      }
    }
    

    myAdapter 是您的适配器必须首先初始化,它与您的适配器类相关联

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-29
      • 2020-03-05
      • 2015-10-03
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多