Kotlin Android应用不使用ArrayAdapter实现Firebase数据变更与ListView展示
解决方案说明
ListView 本身的渲染机制强制依赖Adapter完成数据与视图的绑定,你导师的要求实际是禁止直接使用系统内置的ArrayAdapter/SimpleArrayAdapter,需要自定义Adapter实现,以下是适配代码:
1. 在Activity内部新增自定义BaseAdapter实现
// 自定义Adapter,完全不依赖系统内置ArrayAdapter inner class ProductAdapter(private val data: List<Product>) : BaseAdapter() { override fun getCount() = data.size override fun getItem(position: Int) = data[position] override fun getItemId(position: Int) = position.toLong() override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { // 复用原有布局保证多选功能和原有效果一致 val itemView = convertView ?: layoutInflater.inflate(android.R.layout.simple_list_item_checked, parent, false) val currentProduct = getItem(position) // 直接调用你已实现的toString()方法填充文本 (itemView as CheckedTextView).text = currentProduct.toString() // 同步选中状态 itemView.isChecked = lvItems.isItemChecked(position) return itemView } }
2. 替换原有Adapter声明
将原来的ArrayAdapter声明替换为自定义的ProductAdapter:
val products = ArrayList<Product>() // 替换为自定义Adapter val adptr: ProductAdapter by lazy { ProductAdapter(products) }
3. 绑定与监听逻辑调整
原有逻辑基本无需修改,只需要补充选中状态刷新的监听:
// 原有绑定逻辑不变 lvItems.adapter = adptr lvItems.choiceMode = ListView.CHOICE_MODE_MULTIPLE // 补充列表项点击监听,刷新选中状态展示 lvItems.setOnItemClickListener { _, _, _, _ -> adptr.notifyDataSetChanged() } myRef.child("products").addChildEventListener(object : ChildEventListener { override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) { val p: Product = snapshot.getValue(Product::class.java) as Product p.fillKey(snapshot.key!!) products.add(p) adptr.notifyDataSetChanged() lvItems.smoothScrollToPosition(products.size - 1) } // 其余ChildEventListener的方法保留你原有代码即可 })
修改后完全满足不使用Simple ArrayAdapter的要求,所有原有功能、多选效果、toString()方法的调用都完全保留。
内容的提问来源于stack exchange,提问作者Adi Fynn
相关产品推荐
相关产品推荐

