簡體   English   中英

Kotlin:通過單擊更改 RecyclerView 項目的背景顏色

[英]Kotlin:change background color of RecyclerView item by click on it

我想通過單擊更改回收站視圖行(項目)的背景顏色,我使用 kotlin。
我嘗試了不同的方法,單擊的項目正確更改了背景顏色,但是當我向下滾動時,我看到另一個項目也更改了背景顏色。

事實上,對於該項目的每次點擊,列表中不在用戶視圖中的部分中的另一個項目也會受到影響。

請用一個完整的例子來解釋這個問題。
請務必自行測試
我真的需要解決這個問題

非常感謝

這很容易做到:) 你只需要記住 RecyclerView 是如何工作的:

  1. 它創建了幾個 ViewHolders
  2. 當您滾動列表時,會重復使用 ViewHolders。
  3. 例如,如果列表中有 100 個項目,它將創建 5-6 個 ViewHolders 並重復使用它們。

因此請記住,當onBindViewHolder()時,您可以做的最簡單的事情是檢查項目的一些 state,然后選擇項目的背景顏色。 在這種情況下,您可以選擇/取消選擇列表中的多個項目。 如果您只想檢查一項,則需要稍微更改items.map {} function:

請記住我在下面寫的,您還需要覆蓋適配器等中的更多功能。

class MyAdapter(private val onItemClick: (YouItem) -> Unit): RecyclerView.Adapter() {

    private var items: List<YourItem>

    fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val payload = items[holder.adapterPosition]
        holder.itemView.setOnClickListener {
            onItemClick(payload)
        }
        holder.itemView.background = if(payload.someState) firstBackground else otherBackground
    }

    fun updateItems(updatedItems: List<YourItem>) {
        items = updatedItems
        notifyDataSetChanged()
    }
}
class YourActivity: Activity() {

    private lateinit var items: List<YourItem>

    fun onCreate(savedInstanceState: Bundle) {
         super.onCreate(savedInstanceState)
         ...
         items: List<YourItem> = getItemsFromSomewhere()
         val adapter = MyAdapter { clickedItem ->
             val updatedItems = items.map { 
                 if(it == clickedItem) {
                     it.copy(someState = !it.someState)
                 } else {
                     it
                 }
             items = updatedItems
             adapter.updateItems(updatedItems)
         }
    }
}
data class YourItem(val someState: Boolean)

這主要是因為 RecyclerView 重用了視圖(項目行),因此不需要多次生成視圖。 您可以通過更改 object 的值來僅為特定項目設置背景來解決問題,對於所有其他項目,請保持默認值。

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    if(position == selected_item) {
        holder.view.setBackgroundColor(Color.parseColor("#00aaff"));
    } else {
        holder.view.setBackgroundColor(Color.parseColor("#00000")); //actually you should set to the normal text color
    }
}

或者

public void onItemClick() {
         Model model = itemList.get(clickedPosition);
         model.setBgColor = Color.parseColor("#00aaff");
    }

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    Model model = itemList.get(position);
    holder.view.setBackgroundColor(model.getBgColor());
    
}

暫無
暫無

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

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