getActivity () / context в ViewHolder в Котлин-Андориде

Я создаю ViewHolder и Adapter для фрагмента, и когда я пытаюсь сделать OnClick для ViewHolder, ни один из контекстов, которые я передаю, не работает. Я не могу использовать getActivity() которую я могу использовать, и p0!!.context itemView.context или itemView.context . Где я должен получать свой контекст и как мне его ссылаться? Спасибо!

 package com._________.criminalintent import android.os.Bundle import android.support.v4.app.Fragment import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.RecyclerView import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.TextView import android.widget.Toast class CrimeListFragment: Fragment() { private var mCrimeRecyclerView: RecyclerView? = null private var mAdapter: CrimeAdapter? = null override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { // fragment_crime_list.xml has a RecyclerView element = crime_recycler_view // inflate the fragment into the activity val view = inflater!!.inflate(R.layout.fragment_crime_list, container, false) // grab the recyclerView and give it a required layoutManager mCrimeRecyclerView = view.findViewById(R.id.crime_recycler_view) mCrimeRecyclerView!!.layoutManager = LinearLayoutManager(activity) updateUI() return view } private fun updateUI() { val crimeLab = CrimeLab.get(activity) val crimes = crimeLab.getCrimes() mAdapter = CrimeAdapter(crimes) // Connect the adapter to the recyclerView mCrimeRecyclerView!!.adapter = mAdapter } /** * in Kotlin, we must give the view passed into the constructor directly * as a substitute for a super() call * * create a ViewHolder that holders the crime list item's view * * super(itemView) = super(inflater!!.inflate(R.layout.list_item_crime, parent, false)) * MUST give it the direct value in Kotlin */ private class CrimeHolder(inflater: LayoutInflater?, parent: ViewGroup): RecyclerView.ViewHolder(inflater!!.inflate(R.layout.list_item_crime, parent, false)), View.OnClickListener { private var mCrime: Crime? = null /** * When given a crime, this CrimeHolder will update the title and date for this Crime */ fun bind(crime: Crime) { mCrime = crime val titleTextView = itemView.findViewById<TextView>(R.id.crime_title) val dateTextView = itemView.findViewById<TextView>(R.id.crime_date) titleTextView.text = mCrime!!.mTitle dateTextView.text = mCrime!!.mDate.toString() } override fun onClick(p0: View?) { Toast.makeText(WHAT_TO_PUT_HERE, "${mCrime!!.mTitle} clicked!", Toast.LENGTH_SHORT / 2) .show() } } private class CrimeAdapter(private var mCrimes: MutableList<Crime>): RecyclerView.Adapter<CrimeHolder>() { /** * - Calls our CrimeHolder to make our custom ViewHolders * - Called by RecyclerView when it needs a new view to display * - Gets the layoutInflater from the ViewGroup and returns a CrimeHolder of it */ override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): CrimeHolder = CrimeHolder(LayoutInflater.from(parent!!.context), parent) /** * Bind the crime (data) to the CrimeHolder */ override fun onBindViewHolder(holder: CrimeHolder?, position: Int) { holder!!.bind(mCrimes[position]) } /** * Sees how many items are in the RecyclerView that need to be shown */ override fun getItemCount(): Int = mCrimes.size } } 

    В вашей реализации вы можете безопасно использовать Context from View предоставленный вашему OnClickListener

     override fun onClick(p0: View) { Toast.makeText(p0.context, "${mCrime!!.mTitle} clicked!", Toast.LENGTH_SHORT / 2) .show() } 

    Не забудьте установить onclick:

     fun bind(crime: Crime) { mCrime = crime val titleTextView = itemView.findViewById<TextView>(R.id.crime_title) val dateTextView = itemView.findViewById<TextView>(R.id.crime_date) titleTextView.text = mCrime!!.mTitle dateTextView.text = mCrime!!.mDate.toString() itemView.setOnClickListener(this) } 

    Более того, все классы Kotlin по умолчанию являются вложенными ( static ). Таким образом, ваш private class CrimeHolder эквивалентен private static class CrimeHolder в Java. Вот почему у вас нет доступа к getActivity() из CrimeHolder

    Используйте свойство itemView.context внутри вашего держателя.

    Изменить: причина, по которой ваш onClick не работает (не вызывается), заключается в том, что вы не зарегистрировали onClickListener , например:

     itemView.setOnClickListener(this) 

    внутри вашего держателя init или bind .

    Intereting Posts
    Конструктор вложения и объект-компаньон Соответствие регулярных выражений в строке Kotlin & Anko сопрограммы: возвращение вне асинхронного Kotlin Generics: Котлин не признает мой класс с правильным наследованием ProGuard заставляет Gson возвращать LinkedTreeMap вместо моего типа Выйти из анонимной функции в котлин Kotlin и Jack не поддерживаются (Android Studio 2.3.2) Android Kotlin передает значение с текстовых полей на numberPicker Имеет ли Kotlin метод-CALL ярлыки? Почему класс Kotlin не нужно открывать в Spring Boot больше Почему .map в mutableList фактически не изменяет значения внутри List в Kotlin? KotlinNullPointerException: внутри onCreateOptionsMenu не удается найти searchView; андроид Ошибка сборки: ошибка: выполнение не выполнено для задачи: app: compileLightningLiteDebugKotlin '. > Ошибка компиляции Как: стрелять и забывать асинхронные сопрограммы в Котлине База данных Firebase всегда отключена, когда протестирована на физическом устройстве Android