最终在我的服务器中实现了设备类型的图标后,我用来自服务器的图标替换了以前使用的临时可绘制文件,并使用coil
来加载它们.它们的ImageView
在适配器BTW内.在第一次抽奖时,所有的东西都被正确地"对齐",标签和图像是正确的配对.但如果我进行某种排序,ImageView
中的图像不再与标签对齐,或者它们完全消失了.我在我的应用程序中有一种行为,即首先我将从服务器获取并显示数据,如果本地数据与服务器的数据相同,那么我将只使用本地数据.但我认为这不会影响任何事情,因为我将服务器数据的每个字段都保存在数据库中.我还添加了一些日志(log),以查看coil
应该检索哪个URL,并且它们是每个图标的正确URL.我调用notifyDatasetChanged()
来重画适配器,因为排序返回的项长度可能与默认列表不同,默认列表就是我拥有的所有项.
下面是我的适配器的代码:
class ActuatorDeviceInfoAdapter(
val ctx: FragmentActivity,
var itemLst: MutableList<ActuatorDeviceInfo>,
val showToggle: Boolean
) : RecyclerView.Adapter<ActuatorDeviceInfoAdapter.ViewHolder>() {
private lateinit var binding: AdapterActuatorBinding
var onItemClick: ((ActuatorDeviceInfo) -> Unit)? = null
var onToggleClick: ((ActuatorDeviceInfo, Boolean, AdapterActuatorBinding) -> Unit)? = null
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): ActuatorDeviceInfoAdapter.ViewHolder {
binding = AdapterActuatorBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
override fun onBindViewHolder(holder: ActuatorDeviceInfoAdapter.ViewHolder, position: Int) {
val pic = itemLst[position]
holder.bind(pic)
}
override fun getItemCount(): Int = itemLst.size
inner class ViewHolder(private val binding: AdapterActuatorBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(actuatorDeviceInfo: ActuatorDeviceInfo) {
binding.actuatorDevInfo = actuatorDeviceInfo
if (showToggle) {
binding.tglStatus.visibility = View.VISIBLE
binding.tglStatus.isChecked = actuatorDeviceInfo.status
} else {
binding.tglStatus.visibility = View.GONE
}
setIcon(actuatorDeviceInfo.type!!)
}
init {
itemView.setOnClickListener {
onItemClick?.invoke(itemLst[adapterPosition])
}
binding.tglStatus.setOnClickListener {
onToggleClick?.invoke(itemLst[adapterPosition], binding.tglStatus.isChecked, binding)
}
}
}
private fun setIcon(type: ActuatorType) {
val iconPath = "${Utils.instance.getServerHost(ctx)}${type.iconPath}"
binding.imgIcon.load(iconPath)
}
companion object{
const val TAG = "ActuatorDeviceInfoAdapter"
}
}