如何使用 ViewPager 显示相同的片段,但每次加载不同的数据?

Posted

技术标签:

【中文标题】如何使用 ViewPager 显示相同的片段,但每次加载不同的数据?【英文标题】:How can I use a ViewPager to display the same fragment but loaded with different data each time? 【发布时间】:2021-10-10 20:45:12 【问题描述】:

我正在尝试设置 ViewPager 以显示相同的模板片段,但在每次滑动后填充不同的数据。我在这里使用虚拟数据,但我的问题是每次滑动后都会加载相同的数据。我到底做错了什么?

这是我的代码:

测试:

public class Test 
    private String a;
    private String b;
    private int c;

    public Test(String a, String b, int c) 
        this.a = a;
        this.b = b;
        this.c = c;
    

    public static final Test[] testData = 
            new Test("Title 1", "Description 1", 1),
            new Test("Title 2", "Description 2", 2),
            new Test("Title 3", "Description 3", 3),
            new Test("Title 4", "Description 4", 4),
            new Test("Title 5", "Description 5", 5)
    ;

    public String getA() 
        return a;
    

    public String getB() 
        return b;
    

    public int getC() 
        return c;
    

测试片段:

public class TestFragment extends Fragment 

    private static final String ARG_ID = "Id";
    private int Id;
    private String a;
    private TextView aTV;
    private String b;
    private TextView bTV;
    private int c;
    private TextView cTV;

    public static TestFragment newInstance(int Id) 
        Bundle args = new Bundle();
        args.putSerializable(ARG_ID, Id);

        TestFragment fragment = new TestFragment();
        fragment.setArguments(args);
        return fragment;
    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        View view = inflater.inflate(R.layout.fragment_test, container, false);

        Id = (Integer) getActivity().getIntent().getExtras().get(EXTRA_ID);
        a = Test.testData[Id].getA();
        b = Test.testData[Id].getB();
        c = Test.testData[Id].getC();

        aTV = (TextView) view.findViewById(R.id.a);
        aTV.setText(a);

        bTV = (TextView) view.findViewById(R.id.b);
        bTV.setText(b);

        cTV = (TextView) view.findViewById(R.id.c);
        cTV.setText(String.valueOf(c));

        return view;
    

ViewPagerActivity:

public class ViewPagerActivity extends AppCompatActivity 

    private ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_pager);

        viewPager = (ViewPager) findViewById(R.id.view_pager);

        FragmentManager fragmentManager = getSupportFragmentManager();
        viewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) 
            @Override
            public Fragment getItem(int position) 
                return TestFragment.newInstance(position);
            

            @Override
            public int getCount() 
                return 5;
            
        );
    

【问题讨论】:

【参考方案1】:

您没有获得TestFragment片段参数,其中您有Id 变量,而是您试图从Intent Extras 中获取数据:

Id = (Integer) getActivity().getIntent().getExtras().get(EXTRA_ID);

您应该通过这种方式获得您在TestFragmentnewInstance 方法中提供的参数:

Id = getArguments().getInt(ARG_ID);

【讨论】:

您好,感谢您的帮助!您的回答确实对我有所帮助,尽管发生了一件奇怪的事情,我似乎无法弄清楚为什么会发生。在您的解决方案中,我能够将Id = getArguments().getInt(EXTRA_ID); 替换为Id = getArguments().getInt(ARG_ID);,并且效果很好。但是,当我使用真实数据时,它只在我通过ARG_ID时有效,在我通过EXTRA_ID时无效。 没错,这只是我这边的一个错误。它应该是ARG_ID,因为它是您尝试从捆绑包中获取的值的键。 我也是这么想的,但我只是不明白为什么它在我通过EXTRA_ID 时发布的代码对我有用。在那张纸条上,我认为我应该再问一个关于这个 ViewPager 的问题,因为它有点相关。我正在尝试向 ViewPager 添加与 ViewPager 执行相同操作的按钮,以便用户可以使用 ViewPager 或按钮来左右翻转。但是,我正在实现的 OnClickListener 在我第一次按下按钮时不起作用,我必须再次按下它才能工作。为什么会发生这种情况,我该如何解决? 我认为这是另一个问题的主题。我想我不能在这里回答,在 cmets 中。 好的,我已将其作为一个单独的问题提出。如果可以,请您回答一下好吗?我一直在尝试自己修复它,但没有成功。

以上是关于如何使用 ViewPager 显示相同的片段,但每次加载不同的数据?的主要内容,如果未能解决你的问题,请参考以下文章

在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段

如何在 viewpager 中显示 2 个片段

如何实现具有不同片段/布局的 ViewPager

如何解决片段中的 Viewpager 问题?

如何防止创建相同片段的 2 个实例?

有没有办法使用相同的布局动态创建片段并向它们显示数据?