为什么我的RecyclerView可以正常滚动但不执行onItemClick方法?

问题描述 投票:0回答:1

我正在 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 methods android-recyclerview onclick android-adapter
1个回答
0
投票

如果我理解您的问题,您希望在单击回收器视图中的项目时添加一个操作,具体取决于位置。 我不是专家,我最近开始使用 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 函数。

希望这次能有所帮助! (我对箭头不好......)

© www.soinside.com 2019 - 2024. All rights reserved.