【问题标题】:Context in RecyclerView click event not being read未读取 RecyclerView 单击事件中的上下文
【发布时间】:2020-10-19 21:40:41
【问题描述】:

由于某种原因,尝试将点击侦听器应用于我的 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
    }
}

【问题讨论】:

  • 您不能从上下文引用开始活动。您必须从活动参考开始。那么startActivity函数就会被正确解析

标签: android kotlin android-recyclerview android-adapter android-context


【解决方案1】:

在 Kotlin 中,嵌套类默认是静态的,因此无需创建类对象即可访问其数据成员和成员函数。嵌套类无法访问外部类的数据成员。

由于“myContext”是外部类的数据成员~“MyAdapter”这就是为什么它在内部类中没有解决。

【讨论】:

  • 那么myContext应该移到内部类吗?
  • 可以从ViewHolder中的“itemView.getContext()”获取上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多