android - 从 getItemPosition 更新 ViewPager 中的 fragment

标签 android android-fragments android-viewpager fragmentpageradapter android-tablayout

我有一个屏幕,其中包含来自设计支持库的新 TabLayout。我还有一个用于显示 fragment 的 ViewPager。此 fragment 根据选择的选项卡显示不同的 View 列表。

应用程序收到对网络调用的响应,我的 Activity 使用响应返回的数据更新属于 ViewPager 的 FragmentPagerAdapter,在我的例子中这是 3 个列表。

在我的 ViewPager 中,我覆盖了 onPageChangeListener() 以检测何时选择了页面,然后我使用新的选项卡位置调用我的 FragmentPagerAdapter。我还调用了 notifyDataSet() 以重绘 View 。

我覆盖了 getItemPosition() 方法来确定应将哪个列表传递给 fragment 。但是我认为这不是正确的方法,因为它们是从 getItemPosition 发生的大量 overdraw 。该方法实际上是用相同的结果列表更新每个 fragment 。当滚动到下一个选项卡时,当前列表在下一个选项卡中可见,直到滚动被释放,然后 fragment 重新绘制正确的列表。

我的问题是我是否采用了正确的方法来显示我的 ViewPager fragment 中的列表?还是我真的把事情复杂化了?我对 ViewPagers 或 FragmentPagerAdapters 没有太多经验,因此非常感谢任何输入。

我的代码如下。

添加 fragment (从 onResume() 调用)

private void addFragment() {

    mViewPager = (ViewPager) findViewById(R.id.viewpager);

    mMyPagerAdapter = new MyPagerAdapter(getSupportFragmentManager(),
            SampleActivity.this);

    mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(final int i, final float v, final int i2) {
        }
        @Override
        public void onPageSelected(final int i) {
            mMyPagerAdapter.updateTabPosition(i);
        }
        @Override
        public void onPageScrollStateChanged(final int i) {
        }
    });

    mViewPager.setAdapter(mMyPagerAdapter);
    mViewPager.setOffscreenPageLimit(1);

    mTabLayout = (TabLayout) findViewById(R.id.my_tab_layout);
    mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    mTabLayout.setTabMode(TabLayout.MODE_FIXED);
    mTabLayout.setupWithViewPager(mViewPager);

    if (shouldMakeNetworkCall()) {
        getLists();
    }
}

ViewPager FragmentPagerAdapter 类

public class MyFragment extends FragmentPagerAdapter {

private Context mContext;
final int PAGE_COUNT = 3;
private String tabTitles[] = new String[] { "One", "Two", "Three" };
private List<MyListType> mListOne;
private List<MyListType> mListTwo;
private List<MyListType> mListThree;
private int mTabPosition;

public MyPagerAdapter(FragmentManager fm, Context context) {
    super(fm);
    mContext = context;
}

@Override
public Fragment getItem(int position) {
    switch (position) {
        case 0:
            return MyFragment.newInstance(mListOne);
        case 1:
            return MyFragment.newInstance(mListTwo);
        case 2:
            return MyFragment.newInstance(mListThree);
        default:
            return null;
    }
}

@Override
public int getCount() {
    return PAGE_COUNT;
}

@Override
public CharSequence getPageTitle(int position) {
    // Generate title based on item position
    return tabTitles[position];
}

@Override
public int getItemPosition(Object object) {
    if (object instanceof MyFragment) {

        switch (mTabPosition) {
            case 0:
                ((MyFragment) object).setupUI(mListOne);
                break;
            case 1:
                ((MyFragment) object).setupUI(mListTwo);
                break;
            case 2:
                ((MyFragment) object).setupUI(mListThree);
                break;
            default:
                break;
        }
    }
    return super.getItemPosition(object);
}


public void updateTabPosition(int tabPosition) {
    mTabPosition = tabPosition;
    notifyDataSetChanged();
}
}

最佳答案

实际上,我确实认为你让这件事复杂化了。

对我来说,最好的解决方案是进行 3 次网络调用,每次调用 ViewPager 中的 fragment 。让 fragment 自行管理它们的调用,就像您在单个 fragment Activity 上所做的那样。这样,如果您想要适当的用户体验,您甚至可以在每个 fragment 上显示和隐藏进度。我建议使用 Switcher为此

问题是你能单独调用吗?因为如果你做不到,那将是进行 3 次相同的大调用,这不是最明智的想法。在第二种情况下,您可以开始每个 fragment 的进度旋转,然后让 Activity 进行调用。对我来说,与 ViewPager fragment 通信的首选解决方案是使用 events .您只需在 Activity 中进行调用,并在加载后分别拆分数据并发送 3 个事件和其中的数据,让每个 fragment 响应它们。只需在 onAttach 中注册到 EventBus 并在 onDetach 方法中注销

关于android - 从 getItemPosition 更新 ViewPager 中的 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31702130/

相关文章:

android - Activity 中的 OnOptionsItemSelected 在 fragment 中的 onOptionsItemSelected 之前被调用。其他方式可能吗?

android - 无法让 objectAnimator 使用 xFraction

android - 从 ViewPager 中删除图像

java - 使用 Mockito 测试 Kotlin 类会导致 MissingMethodInitationException

android - 沿谷歌地图android中的路径动画汽车(标记)

java - 安卓 : FragmentPagerAdapter don't saved the state of Fragment?

android - 更新支持库后,ViewPager 变得显示不正确的页面

android - 键盘出现后如何隐藏底部 TabLayout?

android ios 任何 BLE 的任何唯一 key (我们正在使用所有 BLE - 无制造商依赖性)来识别它

android - OnClickListener() 必须覆盖父类(super class)方法吗?