为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在关闭并重新打开 Dialog Fragment 后仍保留对象列表的值?

为什么在关闭并重新打开 Dialog Fragment 后仍保留对象列表的值?

浮云间 2021-09-29 10:37:28
我正在 Android 中构建一个国家/地区选择器对话框片段,在分段回收器视图中显示国家/地区列表。第一部分显示收藏夹,第二部分显示其余国家/地区。每个条目都显示了国家名称和一颗星星。通过单击星号,该国家/地区将从非最喜欢的部分移动到最喜欢的部分,反之亦然。尽管我找到了一种解决方法,但我想了解 Country 对象列表中持久值的原因。首先,我在一个单独的类中有一个国家对象列表:国家.javapublic class Country {private String mCountryId;private String mName;private int mResourceId;private boolean mIsFavourite;public static final Country[] countries = {        new Country("4", "Afghanistan", R.drawable.zafghanistan, false),        new Country("8", "Albania", R.drawable.zalbania, false),        new Country("12", "Algeria", R.drawable.zalgeria, false),        new Country("20", "Andorra", R.drawable.zandorra, false),        new Country("24", "Angola", R.drawable.zangola, false),        new Country("28", "Antigua and Barbuda", R.drawable.zantigua_and_barbuda, false),};public Country(String countryId, String name, int resourceId, boolean isFavourite) {    mCountryId = countryId;    mName = name;    mResourceId = resourceId;    mIsFavourite = isFavourite;}public String getmCountryId () {    return mCountryId;}public String getmName() {    return mName;}public int getmResourceId() {    return mResourceId;}public boolean getmIsFavourite() {    return mIsFavourite;}public void setmIsFavourite(boolean mIsFavourite) {    this.mIsFavourite = mIsFavourite;}public static List<Country> createCountryList() {    List<Country> countriesArrayList = new ArrayList<>(Arrays.asList(countries));    return countriesArrayList;}}country 对象的最后一个值是一个布尔值,用于存储该国家/地区是否受欢迎。我使用这个值来避免不断查询本地数据库。在我的对话片段中,您可以看到我在开头初始化了国家/地区列表,即它获取 Country 类的所有值,这意味着一开始没有一个国家是最喜欢的。后来我用存储在数据库中的收藏夹更新了它,但它工作正常。我不明白的是以下观察结果:假设我有 5 个最喜欢的国家/地区,我通过在片段外部单击来关闭对话框片段。然后我重新打开对话框片段,国家列表应该再次初始化。至少我对 !=null 的检查表明此时 List 尚未初始化。然后初始化countries = Country.createCountryList();再次发生。这意味着所有喜欢的布尔值都应该是假的,就像第一次打开对话框片段一样。然而,那些最受欢迎的国家显示布尔值真!这怎么可能?如果片段将保留成员变量,则国家列表应该已经在我检查时初始化,但事实并非如此。值是否存储在另一个列表或磁盘上?
查看完整描述

2 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

国家/地区数组是静态的,您必须检查您的代码中是否没有以某种方式将其设置为 true ......

public static final Country[] countries ...

我认为最好的解决方案是从您的国家/地区数组中创建一个克隆...


查看完整回答
反对 回复 2021-09-29
?
烙印99

TA贡献1829条经验 获得超13个赞

假设任何没有将 Country 设置为最喜爱的代码的代码都是徒劳的。

但我仍然认为你有一个 country[] 类的静态对象,它为你的列表保留了持久值。


查看完整回答
反对 回复 2021-09-29
  • 2 回答
  • 0 关注
  • 258 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信