簡體   English   中英

如何使用 Kotlin 在 RecyclerView 中顯示所選項目的項目信息

[英]How to display item info on selected item in RecyclerView using Kotlin

如何在不使用 onClick 方法的情況下顯示來自 recyclerview 選定項目的一些信息。 當應用程序啟動時,第一個項目被選中並突出顯示。 我需要例如。 將 Toast 與數據 class 中的任何值一起使用。 我已經實現了 onClick 方法,但問題是如何在不使用這種方法的情況下做到這一點。

這是主要活動:

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        val exampleList = generateDummyList(20)
        val exampleAdapter = ExampleAdapter(getItem, exampleList)

        exampleAdapter.onItemClick = { item, position: Int ->
            Toast.makeText(this, "Position: $position", Toast.LENGTH_SHORT).show() 
            val intent = Intent(this, ItemActivity::class.java).apply {
                putExtra("itempos", position)
                putExtra("maxSize", maxS)
            }
            startActivity(intent)
        }
    }
}

這是適配器:

class ExampleAdapter(val chosen_item: Int, private val exampleList: List<ExampleItem>):
RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder>()
{
    var onItemClick: ((ExampleItem, Int) -> Unit)? = null    
    var selected_item: Int = chosen_item
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExampleViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_recy, parent, false)
        return ExampleViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: ExampleViewHolder, position: Int){
        val currentItem = exampleList[position]
        holder.tv_ID.text = currentItem.id.toString()
        holder.tv_NAME.text = currentItem.name
        holder.tv_EMAIL.text = currentItem.email
        if (position == selected_item){
            holder.tv_NAME.setBackgroundColor(Color.GREEN)            
        } else {
            holder.tv_NAME.setBackgroundColor(Color.TRANSPARENT)            
        } 
}
override fun getItemCount(): Int {
        return exampleList.size
    }
    inner class ExampleViewHolder(itemView:View): RecyclerView.ViewHolder(itemView) {
        val tv_ID: TextView = itemView.tv_ID
        val tv_NAME: TextView = itemView.tv_NAME
        val tv_EMAIL: TextView = itemView.tv_EMAIL
    init {
            itemView.setOnClickListener{
                onItemClick?.invoke(exampleList[absoluteAdapterPosition], absoluteAdapterPosition)
                notifyItemChanged(selected_item)
                selected_item = absoluteAdapterPosition
                notifyItemChanged(selected_item)                
            }            
            itemView.isSelected
        }
    }
}

我有第二個活動 - 當用戶單擊第一個活動(recyclerview)中的項目時 - 這第二個活動是打開的 - 然后我將項目的 id 提高一個並再次打開第一個活動,其中另一個項目被突出顯示。 我需要顯示例如。 EMAIL 來自 ExampleItem class。

這是第二個活動:

class ItemActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_item)
        var itempos = intent.getIntExtra("itempos",0)
        val maxSize = intent.getIntExtra("maxSize",0)
        button2.setOnClickListener {
            if (itempos == maxSize){
                itempos = itempos
            } else {
                itempos = itempos + 1
            }
            val intent = Intent(this, MainActivity::class.java).apply {
                putExtra("itemposplus", itempos)
            }
            startActivity(intent)
        }
    }
}

如果我理解正確,您希望隨時(無需單擊)獲取所選項目。 有幾種方法可以做到這一點。 我建議你在 ViewHolder 中使用getAdapterPosition()方法

首先,保存您的 ViewHolder

class ExampleAdapter(val chosen_item: Int, private val exampleList: List<ExampleItem>):
RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder>()
{
    var onItemClick: ((ExampleItem, Int) -> Unit)? = null    
    var selected_item: Int = chosen_item
    lateinit var viewHolder: ExampleViewHolder

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExampleViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_recy, parent, false)
        viewHolder = ExampleViewHolder(itemView)
        return viewHolder
    }

然后在適配器中寫入一個公共方法來獲取活動中的當前項

fun getCurrentItem(): ExampleItem = exampleList.get(viewHolder.getAdapterPosition())

最后,您可以在活動中獲得選定的項目

val selectedItem = exampleAdapter.getCurrentItem()

您也可以在 RecyclerView 中檢查getLayoutManager().findFirstVisibleItemPosition()方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM