【问题标题】:Kotlin RecyclerView start new activityKotlin RecyclerView 开始新活动
【发布时间】:2019-08-18 08:27:12
【问题描述】:

我想使用 Kotlin 从 RecyclerView 开始一个新活动。

我仍在探索 Kotlin,目前停留在如何从 RecyclerView 打开新活动。

class HomeScreenRecyclerAdapter : RecyclerView.Adapter<HomeScreenRecyclerAdapter.ViewHolder>()
{
    private val titles = arrayOf("About Me",
            "About Me", "About Me", "About Me"
    )
    private val details = arrayOf("Item one details", "Item two details",
            "Item three details", "Item four details")


    private val images = intArrayOf(R.drawable.ic_launcher_background,
            R.drawable.ic_launcher_background, R.drawable.ic_launcher_background,
            R.drawable.ic_launcher_background)

    override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder {
        val v = LayoutInflater.from(viewGroup.context)
                .inflate(R.layout.main_card_view, viewGroup, false)
        return ViewHolder(v)
    }

    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
        viewHolder.itemTitle.text = titles[position]
        viewHolder.itemDetail.text = details[position]
        viewHolder.itemImage.setImageResource(images[position])
    }

    override fun getItemCount(): Int {
        return titles.size
    }

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val intent: Intent? = null
        var itemImage: ImageView
        var itemTitle: TextView
        var itemDetail: TextView
        init {
            itemImage = itemView.findViewById(R.id.main_image_view)
            itemTitle = itemView.findViewById(R.id.main_title_view)
            itemDetail = itemView.findViewById(R.id.main_description_view)

            itemView.setOnClickListener { 

            }
        }
    }
}

我只是不知道如何为 RecyclerView 中的每个项目启动一个新活动。我知道我让它变得比现在更复杂。

【问题讨论】:

  • 你的意思是点击回收视图上的一个项目时开始一个新的活动?
  • 这个问题已经被问了很多次了
  • @FahryMohammed 没错,是的

标签: android android-intent kotlin android-recyclerview start-activity


【解决方案1】:

只需在 ViewHolder itemOnClick 方法中启动活动,如下所示。并且你需要传递适配器活动的上下文引用。

class HomeScreenRecyclerAdapter(var mContext:Context) : RecyclerView.Adapter<HomeScreenRecyclerAdapter.ViewHolder>()
{
    private val titles = arrayOf("About Me",
        "About Me", "About Me", "About Me")

    private val details = arrayOf("Item one details", "Item two details",
        "Item three details", "Item four details")


    private val images = intArrayOf(R.drawable.ic_launcher_background,
        R.drawable.ic_launcher_background, R.drawable.ic_launcher_background,
        R.drawable.ic_launcher_background)

    override fun onCreateViewHolder(viewGroup: ViewGroup, i: Int): ViewHolder {
       val v = LayoutInflater.from(viewGroup.context)
            .inflate(R.layout.main_card_view, viewGroup, false)
       return ViewHolder(v)
    }

    override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
       viewHolder.itemTitle.text = titles[position]
       viewHolder.itemDetail.text = details[position]
       viewHolder.itemImage.setImageResource(images[position])
    }

    override fun getItemCount(): Int {
       return titles.size
    }

   inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
      val intent: Intent? = null
      var itemImage: ImageView
      var itemTitle: TextView
      var itemDetail: TextView
     init {
        itemImage = itemView.findViewById(R.id.main_image_view)
        itemTitle = itemView.findViewById(R.id.main_title_view)
        itemDetail = itemView.findViewById(R.id.main_description_view)

        itemView.setOnClickListener { 
             mContext.startActivity(Intent(mContext, ActivityNameWhichYouWantCall::class.java))
        }
    }
  }
}

【讨论】:

  • 你可以从viewholder获取上下文,不需要传递上下文
【解决方案2】:

就用这个吧:

context.startActivity(Intent(context, Activity::class.java))

【讨论】:

    【解决方案3】:

    试试这个解决方案: 首先在您的适配器中将侦听器写入您的 recyclerview 项目:

    class HomeScreenRecyclerAdapter(val data: ArrayList<Data>) : RecyclerView.Adapter<ContactAdapter.ViewHolder>() {
    private var listener: ((Data) -> Unit)? = null
    ...
    
    fun setOnItemClickListener(f: (Data) -> Unit) {
         listener = f
    }
    

    在init内部:

     itemView.setOnClickListener {
          listener?.invoke(data[adapterPosition])
     }
    

    最后在您的 Activity 中,您可以处理项目 clickListeners:

    
    private val data = ArrayList<Data>()
    val adapter = HomeScreenRecyclerAdapter(data)
    
     adapter.setOnItemClickListener {
        when(it){
          1->{startActivity(Intent(context, YourActivity1::class.java))}
          2->{startActivity(Intent(context, YourActivity2::class.java))}
          ...
          else->{}
        }
     }
    

    有数据是您的项目的模型类。 就这些了,希望对你有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多