【问题标题】:(Kotlin) Position of RecyclerView returns -1 when trying to click on an item(Kotlin) RecyclerView 的位置在尝试单击项目时返回 -1
【发布时间】:2019-07-16 14:51:50
【问题描述】:

我是 Android 开发(和 Kotlin)的新手。 我正在尝试实现 RecyclerView (工作正常),当我单击特定行时,它会打开一个新活动(意图)。 但是,每当我按下/单击其中一行时,我只能返回值“-1”。

我尝试了许多不同的方法(您应该会在我的浏览器中看到标签的数量)。 对于像 RecyclerView 这样常见的东西来说,这似乎应该是一个相当简单的事情,但无论出于何种原因,我都无法让它工作。

这是我的 RecyclerView 适配器文件:

class PNHLePlayerAdapter (val players : ArrayList<PNHLePlayer>, val context: Context) : RecyclerView.Adapter<ViewHolder>() {

var onItemClick: ((Int)->Unit) = {}

// Gets the number of items in the list
override fun getItemCount(): Int {
    return players.size
}

// Inflates the item views
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {

    val itemView = LayoutInflater.from(context).inflate(
        R.layout.pnhle_list_item,
        parent,
        false
    )

    val viewHolder = ViewHolder(itemView)

    itemView.setOnClickListener {
        onItemClick(viewHolder.adapterPosition)
    }

    return ViewHolder(itemView)
}

// Binds each item in the ArrayList to a view
override fun onBindViewHolder(holder: ViewHolder, position: Int) {

    holder.tvPlayerName?.text = players[position].Name
    holder.tvPlayerRank?.text = position.toString()
    holder.tvPNHLe?.text = players[position].PNHLe.toString()
    holder.tvTeam?.text = players[position].Team
    holder.ivLeague?.setImageResource(leagueImageID)

}


}

class ViewHolder (view: View) : RecyclerView.ViewHolder(view)  {

val linLayout = view.hor1LinearLayout
val ivTeam = view.teamImageView
val tvPlayerName = view.playerNameTextView
val tvPlayerRank = view.rankNumTextView
val tvPNHLe = view.pnhleTextView
val tvTeam = view.teamTextView
val ivLeague = view.leagueImageView
}

如您所见,有一个类属性“onItemClick”,它使用 lambda 作为点击回调。 我在视图膨胀后的onCreateViewHolder方法中设置了OnClickListener。

接下来,在我的活动中,我将列表添加到我的适配器并设置回调。 但是,每次我“敬酒”时,它都会显示为“-1”。

val adapter = PNHLePlayerAdapter(list, this)
    adapter.onItemClick = { position ->
        Toast.makeText(this, position.toString(),Toast.LENGTH_SHORT).show()
        var intent = Intent(this, PlayerCardActivity::class.java)
        //startActivity(intent)   
    }
    rv_player_list.adapter = adapter

也许我没有正确考虑这个问题,但位置不应该代表 RecyclerView 中项目的行号吗? 理想情况下,我需要使用该位置,以便我可以从“列表”(ArrayList)中获取正确的项目,以便我可以使用 Intent 将信息传递给我的下一个 Activity

【问题讨论】:

    标签: android kotlin android-recyclerview onclicklistener


    【解决方案1】:

    我发现了问题。

    onCreateViewHolder中更改这一行:

    return ViewHolder(itemView)
    

    到这个:

    return viewHolder
    

    【讨论】:

    • 谢谢。这是一个愚蠢的错误,但我很感激你帮我抓住了这个 Fartab
    【解决方案2】:

    我会像这样重新组织适配器:

    class PNHLePlayerAdapter : androidx.recyclerview.widget.RecyclerView.Adapter<Adapter.ViewHolder>() {
    
    interface AdapterListener {
        fun onItemSelected(position: Int?)
    }
    
    var players: List<Player> = listOf()
        set(value) {
            field = value
            this.notifyDataSetChanged()
        }
    var listener: AdapterListener? = null
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_car_selector, parent, false)
        return ViewHolder(view)
    }
    
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(position)
    }
    
    override fun getItemCount(): Int {
        return brands.size
    }
    
    inner class ViewHolder(view: View): androidx.recyclerview.widget.RecyclerView.ViewHolder(view) {
        private var position: Int? = null
        private val baseView: LinearLayout? = view.findViewById(R.id.baseView) as LinearLayout?
        ...
    
        init {
            baseView?.setOnClickListener {
                listener?.onManufacturerSelected(position)
            }
        }
    
        fun bind(position: Int) {
            this.position = position
    
            ...
        }
      }
    }
    

    并从您的活动/片段中将侦听器设置为adapter.listener = this,并实现 onItemSelected(position: Int?)

    override fun onItemSelected(position: Int?) {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2020-07-17
      相关资源
      最近更新 更多