android – 如何在Kotlin中更改数据时重新绑定RecyclerView中的项目?

android – 如何在Kotlin中更改数据时重新绑定RecyclerView中的项目?,第1张

概述我自定义了一个RecyclerView类,它将显示val backupItemList的内容:List< MSetting>在代码B的Kotlin 现在我在RecyclerView类之外修改backupItemList的数据,我认为Code D会在UI中显示最新数据,但是我失败了,UI仍然显示旧数据. 我必须使用Code C来显示最新数据. 代码D有什么问题? 代码A. class UIMain 我自定义了一个RecyclerVIEw类,它将显示val backupItemList的内容:List< MSetting>在代码B的Kotlin

现在我在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中的项目?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1134720.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存