如何在 Activity 内的 RecyclerView 适配器声明中声明单击侦听器
Posted
技术标签:
【中文标题】如何在 Activity 内的 RecyclerView 适配器声明中声明单击侦听器【英文标题】:How to declare click listener within RecyclerView adapter declaration inside Activity 【发布时间】:2021-02-02 18:20:58 【问题描述】:我正在尝试将我的 Activity(包含 RecyclerView
)与 RecyclerView
适配器连接,但在声明部分卡住了。我知道需要指定与我的适配器类中的单击侦听器参数关联的值,但我不确定当每个 RecyclerView 项具有不同的值时应该是什么值。
mAdapter = MyAdapter(this, mList, true, ?)
关于应该用什么替换问号有什么想法吗?
活动
class MainActivity : AppCompatActivity()
private lateinit var mAdapter: MyAdapter
private val mList = ArrayList<MyItem>()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mList.add(
ItemCompany(
getString(R.string.bing)
)
)
mList.add(
ItemCompany(
getString(R.string.google)
)
)
mList.add(
ItemCompany(
getString(R.string.yahoo)
)
)
val mRecyclerView = findViewById<RecyclerView>(R.id.myRecyclerView)
mRecyclerView.layoutManager =
androidx.recyclerview.widget.LinearLayoutManager(this)
mAdapter = MyAdapter(this, mList, true, ?)
mRecyclerView.addItemDecoration(
androidx.recyclerview.widget.DividerItemDecoration(
this,
LinearLayout.VERTICAL
)
)
mRecyclerView.adapter = mAdapter
RecyclerView 适配器
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/"))
itemView.getContext.startActivity(intent)
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】:您可以使用 lamda 声明您的点击侦听器:
val mListener = AdapterView.OnItemClickListener parent, view, position, id ->
val mAdapter = MyAdapter(this, mList, true, mListener)
或者简单地说:
val mAdapter = MyAdapter(this, mList, true) parent, view, position, id ->
【讨论】:
以上是关于如何在 Activity 内的 RecyclerView 适配器声明中声明单击侦听器的主要内容,如果未能解决你的问题,请参考以下文章
Android-启动模式task-lunchmodle-intent flag 总结