【问题标题】:kotlin/android: set each button in recyclerview to start its own activitykotlin/android:在recyclerview中设置每个按钮来启动它自己的activity
【发布时间】:2019-01-05 19:22:21
【问题描述】:

我想做一个活动来选择在游戏中玩哪个关卡。为此,我创建了一个带有按钮的回收站视图。这些按钮中的每一个都应该开始其相应的级别。使用下面的代码(取自适配器),它们都只是指向 MainActivity。有没有简单的方法来改变它?

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.levelButton?.text = items.get(position)
        holder.itemView.levelButton.setOnClickListener{
            var gotoLevel= Intent(context,MainActivity::class.java)
            context.startActivity(gotoLevel)
    }
}

如果我问的太明显了,我深表歉意。我几天前才开始编码,但仍处于那个阶段,您甚至不知道针对您的问题使用合适的谷歌搜索词。

【问题讨论】:

    标签: android android-activity kotlin android-recyclerview onclicklistener


    【解决方案1】:

    您应该从超类 (RecyclerView.Adapter) 中获取上下文。并使用它从 View

    setOnClickListener 方法创建一个 Intent
    class YourHolder(view: View) : RecyclerView.ViewHolder(view) {
        private var buttonView = view.buttonView
        // Variable for the Context
        private lateinit var context : Context
        fun bindHolder(itemData: ItemData) {
            // Init context
            context = super.itemView.context
            // OnClick Button Handler
            buttonView .setOnClickListener{
                // Move to AnotherActivity
                val intent = Intent(this.context, AnotherActivity::class.java)
                intent.putExtra("key", ItemData.value)
                startActivity(this.context, intent, null)
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您有不同的选择来实现这一点 - 理想情况下,我们已经将我们的逻辑与适配器分离,并且您的 Activity 应该处理用户单击其中一行后要处理的操作。

      据我所知,您已经定义了一个应该引用您的视图的 ViewHolder - 对吧?可以像这样添加一个item点击界面:

      class ViewHolder(view : View) : RecyclerView.ViewHolder(view) {
      
          val levelButton : TextView = view.tv_levelButton
      
          interface OnUserAction {
      
              fun onItemClick(item : Item)
          }
      }
      

      并且为了在用户每次单击单元格时触发它 - 而不是在每次视图更新时设置它,您应该只在 onCreateViewHolder 上执行一次:

      override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
          val inflater = LayoutInflater.from(parent.context)
          val holder = ViewHolder(inflater.inflate(R.layout.your_layout, parent, false))
      
          holder.onClick {
              position, _ -> action.onItemClick(items.get(position))
          }
      
          return holder
      }
      

      您在上面看到的这个action字段,它是适配器构造函数上发送的接口:

      class ItemsAdapter(val items: List<Item>, private val action: ViewHolder.OnUserAction)...
      

      有了这个,为了调用一个特定的动作,你只需要在你的活动/片段上实现创建的接口 - OnUserAction

      override fun onItemClick(item: Item) {
          var gotoLevel = getLevel(item)
          context.startActivity(gotoLevel)
      }
      

      编辑: 为了方便起见,我创建了一个 OnClick 扩展函数:

      fun <T : RecyclerView.ViewHolder> T.onClick(event: (position: Int, type: Int) -> Unit): T {
      itemView.setOnClickListener {
          event.invoke(adapterPosition, itemViewType)
      }
      return this
      

      }

      【讨论】:

      • 非常感谢您的意见。我想在这里解决一些问题:首先,view.tv_ levelButton 中的空格是错字,我猜?其次,在holder.onClick 中,我得到了onClick 的“未解决参考”。任何想法为什么?最后,无论你在哪里放List&lt;Item&gt;,我之前都放ArrayList&lt;Array&gt;。所以我想如果我在任何地方用Item 替换Array,它应该可以工作。相反,对于Item 的每次出现,我都会得到“未解决的参考”。我想我需要在某个地方声明它。关于如何和在哪里的任何指示?
      • 是的,这是一个错字。 onClick 是我创建的一个扩展函数——这就是为什么你有那个未解决的参考(我已经用这些信息编辑了我之前的评论)。 Item 是一个通用对象,用于向您显示适配器拥有的数据 - 它应该与您设置列表的类型相同。
      【解决方案3】:

      最简单的做法是更新您的数据模型以包含您要启动的活动的类。现在看起来你只有一个字符串列表。因此,将其更改为具有字符串和要启动的类的自定义对象。

      class Item(val levelButtonText: String, val activityClass: Class<*>)
      

      然后您的绑定将硬编码的 MainActivity::class.java 替换为当前项目类:

      override fun onBindViewHolder(holder: ViewHolder, position: Int) {
          val item = items.get(position)
          holder.levelButton?.text = item.levelButtonText
          holder.itemView.levelButton.setOnClickListener{
              var gotoLevel= Intent(context, item.activityClass)
              context.startActivity(gotoLevel)
      }
      

      然后,无论您在何处为适配器创建项目列表,都将其中一个字符串替换为设置要启动的 Activity 的类的 Item

      希望有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多