我自定义了一个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) }
试试.