【问题标题】:Same fragment called multiple time in ViewPager在 ViewPager 中多次调用相同的片段
【发布时间】:2019-06-20 14:39:58
【问题描述】:

我有一个查看寻呼机。用户可以选择他可以拥有多少个不同的页面。 这些页面都是相同的布局,但它只会加载不同的数据。

这是我的片段适配器:

    public class FragmentAdapter extends FragmentPagerAdapter


{

    private final List<Fragment>  lstFragment = new ArrayList<>();
    private final List<String> lstTitles = new ArrayList<>();

    public FragmentAdapter(FragmentManager fm) {
        super(fm);
    }


    @Override
    public Fragment getItem(int i) {
        return lstFragment.get(i);
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return lstTitles.get(position);
    }

    @Override
    public int getCount() {
        return  lstTitles.size();
    }


    public void AddFragment (Fragment fragment , String title)
    {
        lstFragment.add(fragment);
        lstTitles.add(title);
    }
}

这是多次调用片段的代码:

 FragAdapter = new FragmentAdapter(getSupportFragmentManager());

    viewPager = (ViewPager) findViewById(R.id.main_tabs_pager);
    toolbar = (Toolbar) findViewById(R.id.main_page_toolbar);
    tabLayout = (TabLayout) findViewById(R.id.main_tabs);

    String[] Fragments = {"Frag1", "Frag2", "Frag3", "Frag4"};

    for (int i=0; i<Fragments.length; i++)
    {
        ((FragmentAdapter) FragAdapter).AddFragment(new MenuFragment(),Fragments[i]);
    }


    viewPager.setAdapter(FragAdapter);
    tabLayout = (TabLayout) findViewById(R.id.main_tabs);
    tabLayout.setupWithViewPager(viewPager);

所以它工作正常。但唯一的问题是我不知道如何知道不同片段之间的代码差异。

示例: frag1必须加载5张关于大海的图片 frag2 必须加载 8 张关于太阳的图片

我如何告诉片段该做什么?我试图通过示例将参数传递给构造函数

 public MenuFragment(int numberofpictures, String picturesthemes)
{
    // Required empty public constructor
}

但是构造函数必须是空的,因为在fragment被销毁和重新创建时不会再次调用它...

有人有想法吗?谢谢

更新

我不知道这是否是好方法,但我就是这样做的:

在我创建的主要活动中:

 for (int i=0; i<Fragments.length; i++)
    {
        Bundle parameters = new Bundle();
        parameters.putInt("myInt", i);
        Fragment menuFragment = new MenuFragment();
        menuFragment.setArguments(parameters);
        ((FragmentAdapter) FragAdapter).AddFragment(menuFragment, Fragments[i]);
    }

它为每个片段提供了对标题的引用的 int i。 然后我简单地写了这个函数:

 public String getName (int i)
{
    return Fragments[i];
}

根据该片段通过捆绑获得的 int 返回标题

然后,在 MenuFragment() 中我使用了这个:

 private void fillinthelist()
{

    myInt = getArguments().getInt("myInt");
    String test = ((MainActivity) getActivity()).getName(myInt);

    ListOfProgrammes.add(new Modele_carte(test));

}

所以它从包中获取 int 并通过 MainActivity 中的函数点赞它

这是一个好方法吗?它似乎有效

【问题讨论】:

标签: android android-viewpager fragment


【解决方案1】:

您可以使用setArguments(Bundle) 附加包含参数的Bundle

Bundle parameters = new Bundle();
parameters.putInt("myInt", <int_value>);
Fragment menuFragment = new MenuFragment();
menuFragment.setArguments(arguments);
((FragmentAdapter) FragAdapter).AddFragment(menuFragment, Fragments[i]);

一种常见的做法是在片段的类静态工厂方法中构建和附加 Bundle。

片段可以使用getArguments() 来检索参数。

private int myInt;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    myInt = getArguments().getInt("myInt");
}

【讨论】:

  • 我使用了你的技术,它似乎奏效了。我更新了这个问题,你能检查一下你认为这是否是正确的继续方式吗?
  • 我通常在onCreate() 中得到参数,但在其他地方也可以。实际上它与ViewPager无关,它是一种将参数传输到片段的通用方式。
  • 好的,谢谢,捆绑是传递数据的线性方式吗?我的意思是,它根本不是异步的?如果我为片段 1 创建包,然后创建片段 1,然后我为片段 2 创建包并创建片段 2;片段2不可能拦截数据1?
  • 它不是异步的,每个bundle都附加到一个片段实例上,这有点像将值设置为实例字段,只是框架负责持久性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
相关资源
最近更新 更多