现在我在RecyclerVIEw类之外修改backupItemList的数据,我认为Code D会在UI中显示最新数据,但是我失败了,UI仍然显示旧数据.
我必须使用Code C来显示最新数据.
代码D有什么问题?
代码A.
class UIMain : AppCompatActivity() { overrIDe fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentVIEw(R.layout.layout_main) allList= SettingHandler().getListAllSetting() mRecyclerVIEw.layoutManager = linearlayoutmanager(this,linearLayout.VERTICAL,false) mCustomAdapter= CustomAdapter(allList) mRecyclerVIEw.adapter= mCustomAdapter } public overrIDe fun onActivityResult(requestCode: Int,resultCode: Int,data: Intent) { //Code C if (resultCode == RESulT_OK) { allList=SettingHandler().getListAllSetting() mCustomAdapter= CustomAdapter(allList) mRecyclerVIEw.adapter= mCustomAdapter mCustomAdapter.notifyDataSetChanged() mCustomAdapter.setSelectedItem(selectedBackupItem) } //Code D if (resultCode == RESulT_OK) { allList=SettingHandler().getListAllSetting() mCustomAdapter.setSelectedItem(selectedBackupItem) } } }
代码B.
class CustomAdapter (val backupItemList: List<MSetting>) : RecyclerVIEw.Adapter<CustomAdapter.VIEwHolder>() { val norecord=-1 private var mSelectedItem = norecord overrIDe fun onCreateVIEwHolder(parent: VIEwGroup,vIEwType: Int): CustomAdapter.VIEwHolder { val v = LayoutInflater.from(parent.context).inflate(R.layout.item_recyclervIEw,parent,false) return VIEwHolder(v) } fun getSelectedItem():Int{ return mSelectedItem } fun setSelectedItem(index:Int){ if (index in 0..(backupItemList.size-1) ){ mSelectedItem=index notifyDataSetChanged(); } } overrIDe fun onBindVIEwHolder(holder: CustomAdapter.VIEwHolder,position: Int) { holder.bindItems(backupItemList[position]) } overrIDe fun getItemCount(): Int { return backupItemList.size } inner class VIEwHolder(itemVIEw: VIEw) : RecyclerVIEw.VIEwHolder(itemVIEw) { fun bindItems(aMSetting: MSetting) { itemVIEw.tvSubject.text=aMSetting.name itemVIEw.tvCreatedDate.text=aMSetting.createdDate.toDateString() itemVIEw.tvDescription.text=aMSetting.description itemVIEw.radiobutton.setonClickListener { mSelectedItem=adapterposition notifyDataSetChanged(); } if(adapterposition == 0 && mSelectedItem == norecord) { itemVIEw.radiobutton.isChecked = true mSelectedItem=adapterposition } else { itemVIEw.radiobutton.isChecked =(adapterposition == mSelectedItem) } } } }
至civic.liLister:
如果我使用代码E(我用var替换val),代码C和代码D都得到相同的结果,为什么?
代码E.
class CustomAdapter (var backupItemList: List<MSetting>) : RecyclerVIEw.Adapter<CustomAdapter.VIEwHolder>() { val norecord=-1 private var mSelectedItem = norecord overrIDe fun onCreateVIEwHolder(parent: VIEwGroup,position: Int) { holder.bindItems(backupItemList[position]) } overrIDe fun getItemCount(): Int { return backupItemList.size } inner class VIEwHolder(itemVIEw: VIEw) : RecyclerVIEw.VIEwHolder(itemVIEw) { fun bindItems(aMSetting: MSetting) { itemVIEw.tvSubject.text=aMSetting.name itemVIEw.tvCreatedDate.text=aMSetting.createdDate.toDateString() itemVIEw.tvDescription.text=aMSetting.description itemVIEw.radiobutton.setonClickListener { mSelectedItem=adapterposition notifyDataSetChanged(); } if(adapterposition == 0 && mSelectedItem == norecord) { itemVIEw.radiobutton.isChecked = true mSelectedItem=adapterposition } else { itemVIEw.radiobutton.isChecked =(adapterposition == mSelectedItem) } } } }解决方法 这个秘密可能隐藏在这里:
class CustomAdapter(val backupItemList:List)
当您初始化CustomAdapter的实例时,该值将复制到属性backupItemList,而不是分配引用.因此,当您更改UIMain的属性allList时,backupItemList将不会按预期更改.
解决方案很简单,正如Ganesh Tikone所写:添加一个方法来更新backupItemList.
fun updateData(data: List<MovIEModel>) { backupItemList.clear() backupItemList.addAll(data) notifyDataSetChanged()}
并将代码D更改为:
//Code D if (resultCode == RESulT_OK) { allList=SettingHandler().getListAllSetting() mCustomAdapter.updateData(allList) mCustomAdapter.setSelectedItem(selectedBackupItem) }
试试.
总结以上是内存溢出为你收集整理的android – 如何在Kotlin中更改数据时重新绑定RecyclerView中的项目?全部内容,希望文章能够帮你解决android – 如何在Kotlin中更改数据时重新绑定RecyclerView中的项目?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)