[英]Why the onClick does not work with my RecyclerView item?
我的 RecyclerView 项目 onClick 事件有问题。 这是我的适配器类:
class CategoryRecyclerAdapter( val listener: (position: Int) -> Unit):
RecyclerView.Adapter<CategoryRecyclerAdapter.ViewHolder>() {
private var catTitles = arrayOf(
"lorem ipsum cat one",
"lorem ipsum cat otwo",
"lorem ipsum cat three",
"lorem ipsum cat four",
"lorem ipsum cat five",
"lorem ipsum cat six"
)
private var catImages = arrayOf(
R.drawable.ic_star,
R.drawable.ic_star,
R.drawable.ic_star,
R.drawable.ic_star,
R.drawable.ic_star,
R.drawable.ic_star
)
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.category_item, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: CategoryRecyclerAdapter.ViewHolder, position: Int) {
holder.catTitle.text = catTitles[position]
holder.catImage.setImageResource(catImages[position])
when(position){
0 -> {
holder.catCard.setCardBackgroundColor(Color.parseColor("#FF5668"))
}
1 -> {
holder.catCard.setCardBackgroundColor(Color.parseColor("#18C2E9"))
}
2 -> {
holder.catCard.setCardBackgroundColor(Color.parseColor("#686DF6"))
}
3 -> {
holder.catCard.setCardBackgroundColor(Color.parseColor("#FFA925"))
}
4 -> {
holder.catCard.setCardBackgroundColor(Color.parseColor("#18C2E9"))
}
5 -> {
holder.catCard.setCardBackgroundColor(Color.parseColor("#FF5668"))
}
}
}
override fun getItemCount(): Int {
return catTitles.size
}
inner class ViewHolder(itemView:View): RecyclerView.ViewHolder(itemView), View.OnClickListener{
var catImage: ImageView = itemView.findViewById(R.id.catImage)
var catTitle: TextView = itemView.findViewById(R.id.catTitle)
var catCard: CardView = itemView.findViewById(R.id.catCardItem)
override fun onClick(viewType: View?) {
listener.invoke(adapterPosition)
}
}
}
这是我的 mainActivity 代码:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val categoryList = findViewById<RecyclerView>(R.id.mainCategoryGrid)
categoryList.layoutManager = GridLayoutManager(this, 2).also {
it.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return if (position == 4 )
2
else if (position == 5)
2
else
1
}
}
}
categoryList.adapter = CategoryRecyclerAdapter { position ->
val topActivity = Intent(this, TopActivity::class.java)
val flowersAlphabetActivity = Intent(this, FlowersActivity::class.java)
val readActivity = Intent(this, ReadActivity::class.java)
val commonActivity = Intent(this, CommonActivity::class.java)
val stepperActivity = Intent(this, StepperActivity::class.java)
val phrasesActivity = Intent(this, PhrasesActivity::class.java)
when (position) {
0 -> startActivity(alphabetActivity)
1 -> startActivity(flowersAlphabetActivity)
2 -> startActivity(readActivity)
3 -> startActivity(commonActivity)
4 -> startActivity(stepperActivity)
5 -> startActivity(phrasesActivity)
}
}
}
}
在应用程序中,我使用相同的结构来实现 RecyclerView 项 onClick 侦听器,它工作得很好。 现在这段代码不起作用。 也许问题是因为我在这种情况下使用 spanSizeLookup 而产生的。 请帮助弄清楚为什么它现在不起作用。
PS:我知道 Stackoverflow 上有很多关于 RecyclerView Item Click Listener 的信息,但我不问如何实现这个目标,我只需要弄清楚为什么我的代码不起作用。 还有一个我只是潜入 android 开发,我只使用 Kotlin 而不是 Java。
我是 Java 开发人员,所以我无法使用 Kotlin 进行编码,但我将向您展示如何在Onclick
上更改cardView
背景。
您直接使用没有任何itemView
的条件。
只需将您的条件放入holder.itemView.setOnClickListner
。 见下面的代码
holder.itemView.setOnClickListener(view -> {
Toast.makeText(context, "Item Clicked", Toast.LENGTH_SHORT).show();
when(position){
0 -> {
holder.catCard.setCardBackgroundColor(Color.parseColor("#FF5668"))
}
1 -> {
holder.catCard.setCardBackgroundColor(Color.parseColor("#18C2E9"))
}
2 -> {
holder.catCard.setCardBackgroundColor(Color.parseColor("#686DF6"))
}
3 -> {
holder.catCard.setCardBackgroundColor(Color.parseColor("#FFA925"))
}
4 -> {
holder.catCard.setCardBackgroundColor(Color.parseColor("#18C2E9"))
}
5 -> {
holder.catCard.setCardBackgroundColor(Color.parseColor("#FF5668"))
}
}
});
确保在我的代码中将JAVA
更改为Kotlin
。 如果您有任何问题,请告诉我
在 recyclerview 中添加 Click listner
private lateinit var mListener: OnItemClickListener
interface OnItemClickListener : AdapterView.OnItemClickListener {
fun onItemClick(position: Int)
}
fun setOnItemClickListener(listener: OnItemClickListener) {
mListener = listener
}
接着
您可以简单地将它用于MainActivity
中 recylerview 的点击列表。
adapter.setOnItemClickListener(object : CategoryRecyclerAdapter.OnItemClickListener {
override fun onClick(position: Int) {
when (position) {
0 -> startActivity(alphabetActivity)
1 -> startActivity(flowersAlphabetActivity)
2 -> startActivity(readActivity)
3 -> startActivity(commonActivity)
4 -> startActivity(stepperActivity)
5 -> startActivity(phrasesActivity)
}
}
})
(需要更改函数和变量名)
希望它对你有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.