通过调用 Activity 在 PagerAdapter 中设置项目计数

Setting the item count in a PagerAdapter from the calling Activity

我有一个 Activity 调用包含 ViewPager 的第二个 Activity。

第一个 activity 包括定义(间接)ViewPager 中有多少项的额外数据。

第一个Activity的调用代码是:

                myIntent.setClass(getApplicationContext(),ShowAndTellMultiplesActivity.class);
                myIntent.putExtra("i_split_ways",v_integer_value);
                startActivity(myIntent);

i_split_ways 值用于计算要在 ViewPager 中创建多少项目 - 本质上,如果此值 > 2,则计数应为 i_split_ways -1,如果 > 5 则项目数应为 5.

在接收Activity我声明

static int i_split_ways = 2;

在 Activity class 声明之后。

然后在 Activity 的 onCreate 方法中从 activity 调用中的额外数据分配值,如下所示。

    Intent intent = getIntent();

    i_split_ways = intent.getExtras().getInt("i_split_ways",1);

最后,在 PagerAdapter class 的 getCount() 函数中,我按如下方式计算要显示的项目数。

public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a PlaceholderFragment (defined as a static inner class below).
        return PlaceholderFragment.newInstance(position + 1);
    }

    @Override
    public int getCount() {
        if (i_split_ways > 5) i_split_ways = 5 ;
        if (i_split_ways <= 2) i_split_ways = 2;
        return i_split_ways;
    }

请注意,此处的逻辑需要一些工作,但这与此处的问题无关。

我遇到的问题是,当我启动第二个 activity 时,当 i_split_ways 不是 3 时,我得到一个错误,例如 The application's PagerAdapter changed the adapter's contents without calling PagerAdapter#notifyDataSetChanged! Expected adapter item count: 2, found: 4

我可以看出问题可能与我需要调用

有关
        mSectionsPagerAdapter.notifyDataSetChanged();

在某些时候,但我不知道我应该在哪里调用它 - 或者实际上如果我正在尝试做的事情有更根本的错误。

每次基础数据发生变化时都需要调用mSectionsPagerAdapter.notifyDataSetChanged();

根据您提供的信息判断,我猜您正在做这样的事情:

@Override
protected void onCreate(Bundle savedInstance) {
    // calling super and setting content view

    mSectionsViewPager.setAdapter(mSectionsPagerAdapter);

    // maybe some more stuff

    Intent intent = getIntent();
    i_split_ways = intent.getExtras().getInt("i_split_ways",1);
}

如果您在将适配器设置为 viewpager 之前更改 i_split_ways 变量,则不必调用 notifyDataSetChanged()。所以它看起来像这样:

@Override
protected void onCreate(Bundle savedInstance) {
    // calling super and setting content view

    Intent intent = getIntent();
    i_split_ways = intent.getExtras().getInt("i_split_ways",1);
    mSectionsViewPager.setAdapter(mSectionsPagerAdapter);

    // maybe some more stuff 
}