Контекст в RecyclerView событие щелчка не читается

#android #kotlin #android-recyclerview #android-adapter #android-context

#Android #kotlin #android-recyclerview #android-адаптер #android-контекст

Вопрос:

По какой-то причине контекст в моем RecyclerView адаптере не считывается при попытке применить прослушиватель щелчков к моему RecyclerView элементу, чтобы начать новое действие. myContext.startActivity(intent) возвращает ошибку «неразрешенная ссылка». На что его следует изменить, чтобы контекст был прочитан? Нужно ли мне использовать контекст держателя представления TextView или что-то еще?

Неразрешенная ссылка: MyContext

 class MyAdapter(
        val myContext: Context,
        var listCompany: MutableList<ItemCompany>,
        private val mTwoPane: Boolean,
        private val itemClickListener: AdapterView.OnItemClickListener
) : androidx.recyclerview.widget.RecyclerView.Adapter<MyAdapter
.CompanyViewHolder>() {

    class CompanyViewHolder(itemView: View) : androidx.recyclerview.widget.RecyclerView
    .ViewHolder(itemView) {
        var tvTitle: TextView = itemView.findViewById(R.id.tv_RVItem)

        fun bind(company: ItemCompany, clickListener: AdapterView.OnItemClickListener)
        {
            tvTitle.text = company.companyName

            itemView.setOnClickListener {v ->
                val intent: Intent = when (company.companyName) {
                    v.resources.getString(R.string.bing) -> {
                        Intent(Intent.ACTION_VIEW,
                                Uri.parse("https://www.bing.com/"))
                    }
                    v.resources.getString(R.string.google) -> {
                        Intent(Intent.ACTION_VIEW,
                                Uri.parse("https://www.google.com/"))
                    }
                    else -> {
                        Intent(Intent.ACTION_VIEW,
                                Uri.parse("https://www.yahoo.com/"))
                    }
                }
                myContext.startActivity(intent)

                clickListener.onItemClick(company)
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CompanyViewHolder {
        val inflater = LayoutInflater.from(myContext)
        val v = inflater.inflate(R.layout.rv_item, parent, false)
        return CompanyViewHolder(v)
    }

    override fun onBindViewHolder(holder: CompanyViewHolder, position: Int) {
        val product = listCompany[holder.adapterPosition]

        holder.tvTitle.text = product.companyName

        holder.bind(product, itemClickListener)
    }

    override fun getItemCount(): Int {
        return listCompany.size
    }

    override fun getFilter(): Filter {
        return companyFilter
    }
}
  

Комментарии:

1. вы не можете запустить действие из ссылки на контекст. Вы должны запустить его из ссылки на действие. Тогда функция startActivity будет решена правильно

Ответ №1:

В Kotlin вложенный класс по умолчанию является статическим, поэтому к его элементу данных и функции-члену можно получить доступ без создания объекта класса. Вложенный класс не может получить доступ к элементу данных внешнего класса.

Поскольку «MyContext» является членом данных внешнего класса ~ «MyAdapter», поэтому он не разрешен во внутреннем классе.

Комментарии:

1. Так что следует myContext переместить во внутренний класс?

2. Вы можете получить контекст из «ItemView.getContext ()» в ViewHolder.