[英]How save the state of the item on my fragment?
I'm getting a ArrayList
from an Url with AsyncTask
, and inserting into an ListView
on my Fragment
but everytime I change fragments I have to get json data from the Url again so I tried to use onSaveInstanceState()
to save my ArrayList
as a String
and transform to my ArrayList
using JsonObject
and Gson Library
but I can't save the data.我从带有
AsyncTask
的 Url 获取ArrayList
,并插入到我的Fragment
上的ListView
但每次更改片段时我都必须再次从 Url 获取 json 数据,因此我尝试使用onSaveInstanceState()
将我的ArrayList
保存为String
并使用JsonObject
和Gson Library
转换为我的ArrayList
但我无法保存数据。
OnSave method OnSave 方法
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
outState.putString("cursos", this.cursosString);
super.onSaveInstanceState(outState);
}
OnCreateView method 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 {
...
Change Fragments method更改片段方法
public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.navigation_profile:
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.nav_fragment, perfilFragment)
.commit();
return true;
Here is the solution, you just left to decide how to implement getTagForFragmentId()
and getFragmentForFragmentTag(fragmentTag)
, which should be simple.这是解决方案,您只需决定如何实现
getTagForFragmentId()
和getFragmentForFragmentTag(fragmentTag)
,这应该很简单。
The idea of the code below is that you .hide()
previous fragment presented and then you either .add(fragment)
a new fragment, if it was not previously presented or .show()
fragment if it is already inside the backstack.下面代码的想法是你
.hide()
之前的片段呈现,然后你要么.add(fragment)
一个新片段,如果它以前没有呈现,或者.show()
片段,如果它已经在 backstack 中。
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();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.