Java 如何在我的片段上保存项目的状态?
我使用Java 如何在我的片段上保存项目的状态?,java,android,android-savedstate,Java,Android,Android Savedstate,我使用AsyncTask从Url获取ArrayList,并将其插入Fragment上的ListView,但每次更改片段时,我都必须再次从Url获取json数据,因此我尝试使用onSaveInstanceState()将我的ArrayList保存为字符串并使用JsonObject和Gson库转换为我的ArrayList,但我无法保存数据 OnSave方法 @Override public void onSaveInstanceState(@NonNull Bun
AsyncTask
从Url获取ArrayList
,并将其插入Fragment
上的ListView
,但每次更改片段时,我都必须再次从Url获取json数据,因此我尝试使用onSaveInstanceState()
将我的ArrayList
保存为字符串
并使用JsonObject
和Gson库
转换为我的ArrayList
,但我无法保存数据
OnSave方法
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
outState.putString("cursos", this.cursosString);
super.onSaveInstanceState(outState);
}
OnCreateView方法
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view = inflater.inflate(R.layout.fragment_cursos, container, false);
final ListView lvCursos = view.findViewById(R.id.lvCursos);
if(savedInstanceState != null){
Type arrayListCurso = new TypeToken<ArrayList<Curso>>(){}.getType();
ArrayList<Curso> cursos = new Gson().fromJson(savedInstanceState.getString("cursos"), arrayListCurso);
ListaCursosAdapter adapter = new ListaCursosAdapter(cursos, getActivity());
lvCursos.setAdapter(adapter);
} else {
...
这里是解决方案,您只需决定如何实现
getTagForFragmentId()
和getFragmentForFragmentTag(fragmentTag)
,这应该很简单
下面代码的思想是,您可以.hide()
显示以前的片段,然后添加(片段)一个新片段(如果以前未显示),或者.show()
片段(如果它已经在backbackback中)
String lastPresentedFragmentTag = "";
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.navigation_profile:
// getTagForFragmentId() can be just a switch case function
// or you can hardcode value instead
String fragmentTag = getTagForFragmentId(R.id.navigation_profile);
presentFragment(fragmentTag);
return true;
//...
public void presentFragment(String fragmentTag) {
if (lastPresentedFragmentTag == fragmentTag) {
return;
}
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
// Hide previous fragment
if (lastPresentedFragmentTag != null) {
Fragment lastFragmenter code hereent = getSupportFragmentManager().findFragmentByTag(lastPresentedFragmentTag);
ft.hide(lastFragment);
}
Fragment currentFragment = getSupportFragmentManager().findFragmentByTag(fragmentTag);
if (currentFragment == null) {
// Implement getFragmentForFragmentTag(fragmentTag) it will be another switch case function that will return you fragment
val fragment = getFragmentForFragmentTag(fragmentTag);
transaction.add(R.id.fragmentContainer, fragment, tag);
} else {
transaction.show(currentFragment);
}
}
transaction.commitNow();
}
太多了,只是一个注释,它只在我不初始化
lastPresentedFragmentTag
时起作用,但代码解决了我的问题
String lastPresentedFragmentTag = "";
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.navigation_profile:
// getTagForFragmentId() can be just a switch case function
// or you can hardcode value instead
String fragmentTag = getTagForFragmentId(R.id.navigation_profile);
presentFragment(fragmentTag);
return true;
//...
public void presentFragment(String fragmentTag) {
if (lastPresentedFragmentTag == fragmentTag) {
return;
}
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
// Hide previous fragment
if (lastPresentedFragmentTag != null) {
Fragment lastFragmenter code hereent = getSupportFragmentManager().findFragmentByTag(lastPresentedFragmentTag);
ft.hide(lastFragment);
}
Fragment currentFragment = getSupportFragmentManager().findFragmentByTag(fragmentTag);
if (currentFragment == null) {
// Implement getFragmentForFragmentTag(fragmentTag) it will be another switch case function that will return you fragment
val fragment = getFragmentForFragmentTag(fragmentTag);
transaction.add(R.id.fragmentContainer, fragment, tag);
} else {
transaction.show(currentFragment);
}
}
transaction.commitNow();
}