【问题标题】:Fragment showing the wrong arguments显示错误参数的片段
【发布时间】:2023-03-16 09:32:01
【问题描述】:

我有一个使用 viewpager 和带有标签的片段的 Activity。我将数据从活动传递到片段,但它总是显示特定选项卡的错误数据。我有一个片段应该根据通过包传递的参数查询数据。

private Fragment createFragment(String title){
    HomeFragment fragment = new HomeFragment();
    Bundle bundle = new Bundle();
    bundle.putString("category",title);
    fragment.setArguments(bundle);
    return fragment;

}

然后我像这样在 viewpager 上传递这个函数:

ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFragment(createFragment("Item 1"),"Tab 1");
    adapter.addFragment(createFragment("Item 2"),"Tab 2");
    adapter.addFragment(createFragment("Item 3"),"Tab 3");
    adapter.addFragment(createFragment("Item 4"),"Tab 4");
    adapter.addFragment(createFragment("Item 5"),"Tab 5");

最后我得到的参数是这样传递的:

String argument = this.getArguments().getString("category");

问题是当我在选项卡 1 上时,它返回项目 2。但是当我访问所有选项卡时,它开始返回正确的项目,即在选项卡 1 上的项目 1。

问题出在哪里?

编辑:

ViewPagerAdapter:

public class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> fragList = new ArrayList<>();
private final List<String> titleList = new ArrayList<>();

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

@Override
public Fragment getItem(int position) {
  return  fragList.get(position);;
}
public void addFragment(Fragment fragment, String title) {
    fragList.add(fragment);
    titleList.add(title);
}

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

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

}

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    也许您可以创建适配器类并确保在正确的位置传递正确的片段。适配器将片段添加到您实例化它们的错误位置可能是个问题。

    class ViewPagerAdapter extends FragmentPagerAdapter {
            public ViewPagerAdapter(FragmentManager fm) {
                super(fm);
            }
    
        @Override
        public Fragment getItem(int position) {
            switch (position) {
               case 1: return createFragment("Item 1"),"Tab 1");
               case 2: return createFragment("Item 2"),"Tab 2");
               case 3: return createFragment("Item 3"),"Tab 3");
               case 4: return createFragment("Item 4"),"Tab 4");
               case 5: return createFragment("Item 5"),"Tab 5");
            }
        }
    
        @Override
        public int getCount() {
            return NUM_PAGES;
        }
    }
    

    【讨论】:

    • 我正在使用@Override public Fragment getItem(int position) { return fragmentList.get(position); }
    • 您能否发布适配器的完整代码,以及您在列表中添加内容的位置。也许那里有一些错误。
    • 我认为这与添加到列表并同时使用它来获取计数有关。 Android 系统在相当随机的时间调用这些方法,所以我们不知道在您添加所有项目之前是否调用了 getCount 和 getItem...无论如何,最好硬编码 getItem 位置,这样您就可以 100% 确定。
    • 这似乎是唯一的解释,考虑到您正在切换的同一索引与用于在给定索引处获取片段的索引相同。你会期待同样的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多