我正在 Android Studio 中从事 Kotlin 项目。我定义了自己的适配器并在我的活动中实现了 RecyclerView。 RecyclerView 正确填充数据并允许我滚动,但它似乎没有注册 onItemClick(position: Int) 方法的点击。
目前onItemClick方法在Adapter中声明为接口RecyclerViewEvent。这允许我在声明和附加适配器时在活动中实现侦听器。然后我在 Activity 中实现 onItemClick 方法。
当我在模拟器中运行该项目时,它会创建 RecyclerView 并用正确的数据填充它。我可以沿着它滚动(向上和向下),但是当我单击行时没有任何反应。我可以听到它在“点击”,所以我知道它正在接收触摸。我尝试只做一个简单的 toast 消息,并为 onItemClick 方法启动一个新的意图(这就是我需要它做的事情)。
没有抛出任何错误,也不会破坏程序。不知道还能尝试什么。
这是我的适配器:
class GuidedMeditationAdapter(
private val data: List<GuidedMeditationData>,
private val listener: RecyclerViewEvent,
) : RecyclerView.Adapter<GuidedMeditationAdapter.ViewHolder>(){
inner class ViewHolder(view: View): RecyclerView.ViewHolder(view), View.OnClickListener{
val textView: TextView = view.findViewById(R.id.gmrowtextview)
init {
view.setOnClickListener(this)
}
override fun onClick(v: View?) {
val position = bindingAdapterPosition
if (position != RecyclerView.NO_POSITION){
listener.onItemClick(position)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val inflatedView: View = LayoutInflater.from(parent.context)
.inflate(R.layout.fragment_meditation_recyclerview_row,parent,false)
return ViewHolder(inflatedView)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val selection: GuidedMeditationData = data[position]
holder.textView.text = selection.trackName
holder.textView.setBackgroundResource(selection.gmImages)
holder.textView.setOnClickListener{listener}
}
override fun getItemCount(): Int {
return data.size
}
interface RecyclerViewEvent {
fun onItemClick(position: Int)
}
}
然后将其实现到我的 Activity 中,如下所示:
class GuidedMeditationActivity : AppCompatActivity(),
GuidedMeditationAdapter.RecyclerViewEvent {
private val data = createData()
private lateinit var listener: OnClickListener
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.layout_guided_meditation)
val recyclerView: RecyclerView = findViewById(R.id.gm_recyclerview)
recyclerView.adapter = GuidedMeditationAdapter(data,this)
recyclerView.layoutManager = LinearLayoutManager(this)
}
override fun onItemClick(position: Int) {
val userPick = data[position]
val intent = Intent(this,GuidedMeditationExoPlayer::class.java)
startActivity(intent)
Toast.makeText(this, userPick.trackName,Toast.LENGTH_SHORT).show()
}
private fun createData(): List<GuidedMeditationData> {
val title = GuidedMeditationDataRepo.gmNames
val trackId = GuidedMeditationDataRepo.soundcloudTrackID
val img = GuidedMeditationDataRepo.gmImgs
val audIds = GuidedMeditationDataRepo.gmGoogleAudIds
val vidIds = GuidedMeditationDataRepo.gmGoogleVidIds
val gmData = ArrayList<GuidedMeditationData>()
for (i in 0..5) {
gmData.add(
GuidedMeditationData(
title[i],
trackId[i],
img[i],
audIds[i],
vidIds[i]
)
)
}
return gmData
}
}
提前感谢您的阅读和帮助!
如果我理解您的问题,您希望在单击回收器视图中的项目时添加一个操作,具体取决于位置。 我不是专家,我最近开始使用 Kotlin 编码。
关于你的适配器,似乎没问题,但是在你的活动中,如果你想要根据位置执行操作,你必须声明所有。
例如,对于位置 0(第一个位置)=> 您想要“操作 1”。对于位置 1 => 您想要“操作 2”。
所以,我建议您对 recyclerView 中的每个位置使用“when”条件
像这样,在你的活动中:
override fun onItemClick(position: Int) {
when (position) {
0 -> startActivity(Intent(this,GuidedMeditationExoPlayer::class.java))
1 -> Toast.makeText(this, userPick.trackName,Toast.LENGTH_SHORT).show()
}
希望这会有所帮助
编辑: 那么,让我们看看您的适配器。
您可以从适配器中删除您的 onClick 函数,因为 Activity 中的 onItemClick 函数就足够了。
如果你这样做,你也不需要你的接口RecyclerViewEvent,所以你可以删除它。
在您的 init 中,将其替换为: val 位置 = 适配器位置 监听器.onClick(位置)
在onBindViewHolder中,不需要输入setOnClickListener。 Activity 中的 init 和 onClick 就足够了。
在您的 Activity 中,使用 when 方法添加 onItemClick 函数。
希望这次能有所帮助! (我对箭头不好......)