android - android在使用DiffUtil时更改RecyclerView中奇数行的背景颜色
问题描述
我有一个 RecyclerView 并且每个奇数行都有不同的背景颜色。我尝试添加DiffUtil
以加快更新速度,如下所示:
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import com.asdf.android.R
import com.asdf.android.network.model.trade.MarketTradeItem
import kotlinx.android.synthetic.main.row_trade_history.view.*
class MarketTradesListAdapter(
private val context: Context,
private var list: MutableList<MarketTradeItem>,
val theme: Int
) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflate =
LayoutInflater.from(parent.context).inflate(R.layout.row_trade_history, parent, false)
return ItemHolder(inflate)
}
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val itemHolder = holder as ItemHolder
itemHolder.bind(list[position], position)
}
override fun onBindViewHolder(
holder: RecyclerView.ViewHolder,
position: Int,
payloads: MutableList<Any>
) {
if (payloads.isEmpty()) {
super.onBindViewHolder(holder, position, payloads)
} else {
val payload = payloads[0] as DiffUtilPayload
val itemHolder = holder as ItemHolder
itemHolder.bind(list[position], position, payload)
}
}
fun setList(it: List<MarketTradeItem>) {
it.forEachIndexed { index, item -> item.position = index }
DiffUtil.calculateDiff(DiffCallback(list, it),true).dispatchUpdatesTo(this)
list.clear()
list.addAll(it)
}
inner class ItemHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(
order: MarketTradeItem,
position: Int,
payload: DiffUtilPayload = DiffUtilPayload()
) {
var color: Int
if (theme == R.style.Apptheme) {
color = R.color.listBackgroundColorLight
} else {
color = R.color.listBackgroundColorDark
}
// if (payload.isPositionChanged)
itemView.setBackgroundColor(
if (position % 2 == 0) ContextCompat.getColor(
itemView.context,
android.R.color.transparent
) else
ContextCompat.getColor(itemView.context, color)
)
itemView.textViewPrice.setTextColor(
ContextCompat.getColor(
itemView.context,
if (order.isRaise) R.color.buy_green else R.color.sell_red
)
)
if (payload.isPriceChanged) {
itemView.textViewPrice.text = order.price
}
if (payload.isAmountChanged) {
itemView.textViewAmount.text = order.amount
}
if (payload.isTimeChanged) {
itemView.textViewTime.text = order.time
}
}
}
class DiffCallback(
private val oldList: List<MarketTradeItem>,
private val newList: List<MarketTradeItem>
) : DiffUtil.Callback() {
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList[oldItemPosition] == newList[newItemPosition]
}
override fun getOldListSize(): Int {
return oldList.size
}
override fun getNewListSize(): Int {
return newList.size
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList[oldItemPosition] == newList[newItemPosition]
}
override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? {
val oldItem = oldList[oldItemPosition]
val newItem = newList[oldItemPosition]
return DiffUtilPayload(
oldItem.price != newItem.price,
oldItem.amount != newItem.amount,
oldItem.createdAt != newItem.createdAt,
oldItem.time != newItem.time,
oldItem.position != newItem.position
)
}
}
data class DiffUtilPayload(
val isPriceChanged: Boolean = true,
val isAmountChanged: Boolean = true,
val isCreatedAtChanged: Boolean = true,
val isTimeChanged: Boolean = true,
val isPositionChanged: Boolean = true
)
}
问题是,当新项目插入列表时,偶数行和奇数行的背景颜色显示不正确,如下所示:
解决方案
我认为您需要更改areContentsTheSame
DiffUtil 中的方法。如果内容相同,则不会计算不会notifyItemChanged(position)
分发给适配器的更改。它不会要求onBindViewHolder
那个职位/项目。
您应该尝试将方法更改为
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
return oldList[oldItemPosition] == newList[newItemPosition] && oldItemPosition % 2 == newItemPosition % 2
}
推荐阅读
- cmake - 捕获 FetchContent_Declare 失败
- angular - 如何在 ts 文件中将数据从一个组件传递到另一个组件?
- ios - 带有卷积的垂直边缘检测,使用 Swift 给出透明图像
- annotations - Modelica 注释导数:noDerivative 与 zeroDerivative
- powershell - Powershell Read-Host 在 Notepad++ 控制台上无法正常工作
- python - 在 Python 中自动列出多个目录中的文件
- c# - C# 中没有类型的新功能是什么?
- javascript - 检查任务栏是否在移动设备上启用的事件
- javascript - 在 HTML 和 PHP 之间找到 NULL 值的原因
- arrays - 通过角度在 json 上添加额外的转义序列