使用FragmentStatePagerAdapter时“这对于通过对象集合进行分页更好是未定义的。在用户导航到其他页面时销毁片段,从而最大限度地减少内存使用” [
当您第一次加载0位置时,此FragmentStatePagerAdapter的工作方式如下,它的作用是加载 第1页和第1页如果转到第1页,则加载第3页,如果之后(在创建当前位置的基础之后)。 如果我转到实际位置的后退选项卡再没有加载数据,如果它缓存了视图,我的问题 在这种行为中,似乎真实视图的左视图和右视图都被缓存,有某种 省略这种行为
您在stackOverflow中找到的答案尚不清楚,找到一个Internet访问选项,其中提到修改此类 FragmentStatePagerAdapter继承了PageAdapter,我还没有解决这个问题5天,如果有人可以帮我解释一下如何解决它,我会非常高兴。 可以清除FragmentStatePagerAdapter缓存的自定义类 [
// getItem它不能按预期的方式工作(只是膨胀当前片段) 自定义类,可以清除FragmentStatePagerAdapter缓存
public class CostumAdapter extends FragmentStatePagerAdapter {
public CostumAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
System.out.println("POSICION: "+position);
Bundle bundle = new Bundle();
FragmentBebidas fragmentBebidas = new FragmentBebidas();
bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
fragmentBebidas.setArguments(bundle);
return fragmentBebidas;
}
@Override
public CharSequence getPageTitle(int position) {
return menuTabs.get(position).toString();
}
@Override
public int getCount() {
return menuTabs.size();
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}
}
答案 0 :(得分:0)
可以解决此问题,您可以使用FragmentManager
来保留ViewPager
创建的片段。
扩展此abstract
类
public abstract class StateSaveFragmentAdapter extends FragmentPagerAdapter {
public FragmentManager fragmentManager;
public StateSaveFragmentAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
this.fragmentManager = fragmentManager;
}
public abstract int viewPagerId();
public Fragment getSavedFragment(int position) {
return fragmentManager.findFragmentByTag(frameworkFragmentName(viewPagerId(),
getItemId(position)));
}
private String frameworkFragmentName(int viewId, long id) {
return "android:switcher:" + viewId + ":" + id;
}
}
您的适配器应如下所示:
public class CustomAdapter extends StateSaveFragmentAdapter {
public ProjectDetailFragmentAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public int viewPagerId() {
// your viewpager id
return R.id.pager;
}
@Override
public Fragment getItem(int position) {
// check if fragment was saved
if (getSavedFragment(position) != null)
return getSavedFragment(position);
// if save fragment was null, continue with normal implementation
FragmentBebidas fragmentBebidas = new FragmentBebidas();
bundle.putInt("ID", Integer.parseInt(listMenu.get(position).getId()));
fragmentBebidas.setArguments(bundle);
return fragmentBebidas;
}
@Override
public int getCount() {
// your implementation
}
@Override
public CharSequence getPageTitle(int position) {
// your implementation
}
}
答案 1 :(得分:0)
@Isa M我想你需要刷新用户可见的特定片段的数据。为此,您可以使用方法setUserVisibleHint()。因为布尔变量可以让您知道片段是否对用户可见。 如果它是在该块中执行所需的代码。