android - RecyclerView 从不使用 kotlin 中的视图模型刷新
问题描述
我的 onBindViewHolder 仅在第一次被调用(当我初始化空对象时)。当您设置我的列表变量时,列表不会更新。这是我的课程:
class BankAdapter : RecyclerView.Adapter<BankAdapter.MyHolder>() {
private var bankList: List<Bank> = ArrayList()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyHolder {
println("onCreateViewHolder")
val itemView = LayoutInflater.from(parent.context)
.inflate(R.layout.bank_list_item, parent, false)
return MyHolder(itemView)
}
override fun onBindViewHolder(holder: MyHolder, position: Int) {
println("onBindViewHolder")
val currentBank = bankList[position]
var importo: String
if (currentBank.saldo > 1000000) {
importo = "${currentBank.saldo / 1000000}M €"
} else if (currentBank.saldo > 1000) {
importo = "${currentBank.saldo / 1000}K €"
} else {
importo = "${currentBank.saldo} €"
}
holder.txt_nome_banca.text = currentBank.nome
holder.txt_indirizzo_banca.text = currentBank.indirizzo
holder.txt_iban_banca.text = currentBank.iban
holder.txt_saldo.text = importo
}
fun setBankList(bankList: List<Bank>) {
println("setBankList")
this.bankList = bankList
notifyDataSetChanged()
}
override fun getItemCount(): Int {
println("getItemCount " + bankList.size)
return bankList.size //+1 //Aggiungo un elemento per valorizzare l'item per NUOVO
}
inner class MyHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var cl_new = itemView.findViewById<ConstraintLayout>(R.id.cl_new)
var cl_item = itemView.findViewById<ConstraintLayout>(R.id.cl_item)
var txt_nome_banca = itemView.findViewById<TextView>(R.id.txt_nome_banca)
var txt_iban_banca = itemView.findViewById<TextView>(R.id.txt_iban_banca)
var txt_indirizzo_banca = itemView.findViewById<TextView>(R.id.txt_indirizzo_banca)
var txt_saldo = itemView.findViewById<TextView>(R.id.txt_saldo)
}
这是我的片段。在我的 viewModel 观察者中,我在我的适配器中调用 setBankList 方法:
class HomeFragment : Fragment() {
private lateinit var mView: View
val bankAdapter = BankAdapter()
private lateinit var bankViewModel: BankViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
mView = inflater.inflate(R.layout.fragment_home, container, false)
val rvBank = mView.findViewById<RecyclerView>(R.id.rv_banks)
rvBank.adapter = bankAdapter
rvBank.layoutManager = LinearLayoutManager(mView.context)
bankViewModel = ViewModelProviders.of(this).get(BankViewModel::class.java)
bankViewModel.getAllBank().observe(this, Observer { t ->
bankAdapter.setBankList(t)
})
return mView
}
companion object {
@JvmStatic
fun newInstance() =
HomeFragment().apply {
}
}
}
getItemCount 方法在我设置新列表后被调用。大小是对的,但是 onBindViewHolder 没有调用
解决方案
你有几个错误:
- Kotlin 会自动为属性生成 getter 和 setter,因此您可以删除
getAllBank()
. - 在
setBankList(bankList: List<Bank>)
您传递对新列表的引用时,为了使 recyclerview 正常工作,它必须始终指向同一个列表。
所以你需要做的是:
private var bankList: ArrayList = arrayListOf<Bank>()
fun setBankList(bankList: List<Bank>) {
println("setBankList")
this.bankList.clear()
this.bankList.addAll(bankList)
notifyDataSetChanged()
}
推荐阅读
- python-3.x - Windows 补丁自动化
- image-processing - ImageMagick 无法显式更改图像的阴影颜色
- weblogic12c - 在 weblogic 中禁用 wls9_async_response.war 和 wls-wsat.war
- javascript - 如何使用 react 和 canvg 库在画布中添加文本?
- winforms - 为什么在关键事件上使用异步等待时会出现不可预测的结果
- node.js - 将图像上传到 Amazon S3 存储桶
- mysql - 了解 mysql 8.0.11 中的死锁
- kotlin-fuel - Kotlin Fuel 下载需要很长时间才能连接
- ios - Locale 可以通过货币代码识别国家吗?
- javascript - 当我尝试在 connectedCallback 中查询子元素时,我得到一个空节点列表