Собственность иногда не инициализируется - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь обработать щелчки фрагментов в 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!!)
    }

Спасибо за любой совет, и я надеюсь, что мое объяснение делает смысл для всех

1 Ответ

0 голосов
/ 13 февраля 2020

Интерфейс

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

Внутри вашего Адаптер класс

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 означает, что ваш адаптер должен быть инициатором первым, который связан с вашим классом адаптера

...