简体   繁体   English

(科特琳)尝试单击某个项目时,RecyclerView的位置返回-1

[英](Kotlin) Position of RecyclerView returns -1 when trying to click on an item

I'm new to Android development (and Kotlin). 我是Android开发(和Kotlin)的新手。 I'm trying to implement a RecyclerView (which works fine) and when I click on a specific row it opens a new activity (Intent). 我正在尝试实现RecyclerView(工作正常),当我单击特定的行时,它将打开一个新的活动(意图)。 However, whenever I've press/click on one of the rows, I'm only able to get the value "-1" returned. 但是,每当我按下/单击行之一时,我只能获得返回的值“ -1”。

I've tried a number of different approaches (you should see the number of tabs in my browser). 我尝试了许多不同的方法(您应该在浏览器中看到选项卡的数量)。 This seems like it should be a fairly straightforward occurrence for something as common as a RecyclerView, but for whatever reason I'm unable to get it working. 对于像RecyclerView这样常见的事物,这似乎应该是相当简单的事情,但是由于任何原因,我都无法使其正常工作。

Here is my RecyclerView Adapter file: 这是我的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
}

As you can see, there is a class property "onItemClick" which uses a lambda as the click callback. 如您所见,有一个类属性“ onItemClick”,它使用lambda作为click回调。 I setOnClickListener in the onCreateViewHolder method after the view is inflated. 视图膨胀后,我在onCreateViewHolder方法中设置了onOnClickListener。

Next, in my Activity I add the list to my Adapter and set the call back. 接下来,在“活动”中,将列表添加到适配器中,然后设置回叫。 However, every time I 'Toast' the position it is displayed as '-1'. 但是,每次我“举杯”该位置时,它都显示为“ -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

Perhaps I'm not thinking about this properly, but shouldn't the position represent the row number of the item out of the RecyclerView??? 也许我没有考虑正确,但是该位置不应该代表RecyclerView中项目的行号吗??? Ideally, I need to use the position so that I can obtain the correct item from the 'list' (ArrayList) so that I can pass information to my next Activity using the Intent 理想情况下,我需要使用该位置,以便可以从“列表”(ArrayList)中获取正确的项目,以便可以使用Intent将信息传递给下一个Activity

I found the issue. 我发现了问题。

Change this line in onCreateViewHolder : onCreateViewHolder更改此行:

return ViewHolder(itemView)

to this one: 对此:

return viewHolder

I would reorganize the adapter like this: 我将像这样重组适配器:

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

        ...
    }
  }
}

And from your activity/fragment set the listener as adapter.listener = this , and implement the onItemSelected(position: Int?) 然后从您的活动/片段中将侦听器设置为adapter.listener = this ,并实现onItemSelected(position:Int?)

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 kotlin 中的 recyclerview 仅返回 1 个项目 - recyclerview in kotlin returns only 1 item 单击“后退”按钮时,在RecyclerView中获得相同的项目位置 - Getting same item position in RecyclerView, when click on back button 当我单击图像按钮时,获取recyclerview项目的位置 - get the position of a recyclerview item when I click on an imagebutton Android Kotlin - RecyclerView - 获取回收项目的 position - Android Kotlin - RecyclerView - get position of recycled item 尝试实现 RecyclerView 单击侦听器时位置代码不正确 - Incorrect position code when trying to implement RecyclerView click listener 尝试使用Espresso单击RecyclerView项时,没有虚拟方法findViewHolderForPosition(I) - No virtual method findViewHolderForPosition(I) when trying to click on RecyclerView item with Espresso Kotlin:通过单击更改 RecyclerView 项目的背景颜色 - Kotlin:change background color of RecyclerView item by click on it Kotlin 中的 recyclerview 项目点击事件是否需要接口? - Is an interface required for recyclerview item click event in Kotlin? Kotlin:如何在另一个 Recyclerview 内的 Recyclerview 中单击项目 - Kotlin : How to click on item in a Recyclerview Inside another Recyclerview 在项目点击后,Recyclerview保持在位置 - Recyclerview stay at position after item click
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM