#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.