gpt4 book ai didi

java - 为什么在关闭并重新打开对话框 fragment 后保留对象列表的值?

转载 作者:太空宇宙 更新时间:2023-11-04 10:10:31 25 4
gpt4 key购买 nike

我正在 Android 中构建一个国家/地区选择器对话框 fragment ,该 fragment 在分段回收器 View 中显示国家/地区列表。第一部分显示最喜欢的国家,第二部分显示其余国家。每个条目都显示国家/地区名称和一颗星星。通过单击星星,该国家/地区将从不喜欢的部分移至喜欢的部分,反之亦然。

虽然我找到了一种解决方法,但我想了解 Country 对象列表中持久值的原因。首先,我有一个单独的类中的国家/地区对象列表:

国家.java

public 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;
}
}

国家对象的最后一个值是一个 boolean 值,用于存储该国家/地区是否是最喜欢的。我使用这个值来避免不断查询本地数据库。

在我的对话框 fragment 中,您可以看到我在一开始就初始化了国家/地区列表,即它获取了 Country 类的所有值,这意味着一开始没有一个国家/地区是最喜欢的。后来我用数据库中存储的 Collection 夹更新了它,但工作正常。

我不明白的是以下观察结果:假设我有 5 个最喜欢的国家,并且我通过单击 fragment 外部来关闭对话框 fragment 。然后我重新打开对话框 fragment ,国家列表应该再次初始化。至少我对 !=null 的检查显示列表此时尚未初始化。然后用

进行初始化
countries = Country.createCountryList();

又发生了。这意味着所有最喜欢的 boolean 值都应该为 false,就像第一次打开对话框 fragment 一样。然而,那些最受欢迎的国家显示了 true 的 boolean 值!这怎么可能?如果 fragment 将保留成员变量,则国家列表应该已经在我的检查中初始化,但事实并非如此。这些值是否存储在另一个列表或磁盘上?

这是我的对话框 fragment 的相关代码:CountryDialogFragment.java

public class CountryDialogFragment extends DialogFragment {

List<Country> countries;

public static CountryDialogFragment newInstance() {
return new CountryDialogFragment();
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
//Inflate the layout for this fragment
//changed because of bug in support library, see codepath
Log.d(TAG, "onCreateDialog: countrydialogfragment ");
View view = getActivity().getLayoutInflater().inflate(R.layout.fr_dialog_country, null);

//create the dialog
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
alertDialogBuilder.setView(view);
AlertDialog dialog = alertDialogBuilder.create();
dialog.show();
//keyboard shall only appear when click into search field was made
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
dialog.getWindow().clearFlags(
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

//necessary to 'activate' onCreateOptionsMenu method
setHasOptionsMenu(true);

rvCountries = (RecyclerView) view.findViewById(R.id.rvCountries);

if (countries != null) {
Log.d(TAG, "countries initialised: countrydialogfragment");
} else {
Log.d(TAG, "countries not initialised: countrydialogfragment");
}

countries = Country.createCountryList();

//check to see how countries variable was initialised
for(int k=0; k < countries.size(); k++) {
Log.d(TAG, "favourite settings: " + countries.get(k).getmName() + " " + countries.get(k).getmIsFavourite());
}
}
}

以下是对话框 fragment 中的代码部分,用于更改国家/地区列表中的 Collection 夹值:

        //listener for sending countries to non-favorites after the star was clicked
section1.setOnFavClickListener(new CountrySection.OnFavClickListener() {
@Override
public void onStarClick(final String countryIndex) {
//Log.d(TAG, "countryIndex: " + countryIndex);
Country countryFavChanged;
String favName;

for (Country country : countries) {
if (country.getmCountryId().equals(countryIndex)) {
countryFavChanged = country;
favName = countryFavChanged.getmName();
//update favorite status in country list
country.setmIsFavourite(true);

favCountries.remove(countryFavChanged);
section1.removeRow(favCountries);
nonFavCountries.add(countryFavChanged);
section2.addRow(nonFavCountries);
sectionAdapter.notifyDataSetChanged();

Log.d(TAG, "country removed from favs: " + favName);
break;
}
}
}
});

我正在将此库用于分段回收器 View :https://github.com/luizgrp/SectionedRecyclerViewAdapter

我的 CountrySection.java 文件中的代码添加/删除 Collection 夹:

public void addRow(List items) {
Log.d(TAG, "addRow: ");
this.filteredCountryList.clear();
this.filteredCountryList.addAll(items);
}

public void removeRow(List items) {
Log.d(TAG, "removeRow: ");
this.filteredCountryList.clear();
this.filteredCountryList.addAll(items);
}

可能需要优化以仅添加相关国家/地区而不是整个国家/地区列表。

最佳答案

国家/地区数组是静态的,您必须检查您的代码中是否未将其设置为 true...

public static final Country[] countries ...

我认为最好的解决方案是从您的国家/地区数组中创建一个克隆...你可以引用这个问题java pass by value/reference ...

关于java - 为什么在关闭并重新打开对话框 fragment 后保留对象列表的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52406315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com