[英]Kotlin:change background color of RecyclerView item by click on it
我想通過單擊更改回收站視圖行(項目)的背景顏色,我使用 kotlin。
我嘗試了不同的方法,單擊的項目正確更改了背景顏色,但是當我向下滾動時,我看到另一個項目也更改了背景顏色。
事實上,對於該項目的每次點擊,列表中不在用戶視圖中的部分中的另一個項目也會受到影響。
請用一個完整的例子來解釋這個問題。
請務必自行測試
我真的需要解決這個問題
非常感謝
這很容易做到:) 你只需要記住 RecyclerView 是如何工作的:
因此請記住,當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.