从 getItemPosition 更新 ViewPager 中的片段
Update Fragment in ViewPager From getItemPosition
我有一个屏幕,其中包含来自设计支持库的新 TabLayout。我还有一个用于显示片段的 ViewPager。此片段根据选择的选项卡显示不同的视图列表。
应用程序收到对网络调用的响应,我的 activity 使用响应返回的数据更新属于 ViewPager 的 FragmentPagerAdapter,在我的例子中这是 3 个列表。
在我的 ViewPager 中,我覆盖 onPageChangeListener()
以检测何时选择了页面,然后我使用新的选项卡位置调用我的 FragmentPagerAdapter。我还调用 notifyDataSet()
以重绘视图。
我重写了 getItemPosition()
方法来确定应将哪个列表传递给片段。但是我不认为这是正确的方法,因为它们是 getItemPosition
发生的大量透支。该方法实际上是用相同的结果列表更新每个片段。当滚动到下一个选项卡时,当前列表在下一个选项卡中可见,直到滚动被释放,然后片段重新绘制正确的列表。
我的问题是我是否采用了正确的方法来显示我的 ViewPager 片段中的列表?还是我真的把事情复杂化了?我对 ViewPagers 或 FragmentPagerAdapters 没有太多经验,因此非常感谢任何输入。
我的代码如下。
添加片段(从 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 class
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
中的片段。让片段自行管理它们的调用,就像您在单个片段上所做的那样 Activity
。这样,如果您想要适当的用户体验,您甚至可以在每个片段上显示和隐藏进度。我建议使用 Switcher
问题是可以单独调用吗?因为如果你做不到,那将是进行 3 次相同的大调用,这不是最明智的想法。在第二种情况下,您可以启动每个片段并让 activity 进行调用。对我来说,与 ViewPager
片段通信的首选解决方案是使用 events。您只需在 activity 中进行调用,并在加载后分别拆分数据并发送 3 个事件和其中的数据,让每个片段响应它们。只需在 onAttach
中注册到 EventBus 并在 onDetach
方法中注销
我有一个屏幕,其中包含来自设计支持库的新 TabLayout。我还有一个用于显示片段的 ViewPager。此片段根据选择的选项卡显示不同的视图列表。
应用程序收到对网络调用的响应,我的 activity 使用响应返回的数据更新属于 ViewPager 的 FragmentPagerAdapter,在我的例子中这是 3 个列表。
在我的 ViewPager 中,我覆盖 onPageChangeListener()
以检测何时选择了页面,然后我使用新的选项卡位置调用我的 FragmentPagerAdapter。我还调用 notifyDataSet()
以重绘视图。
我重写了 getItemPosition()
方法来确定应将哪个列表传递给片段。但是我不认为这是正确的方法,因为它们是 getItemPosition
发生的大量透支。该方法实际上是用相同的结果列表更新每个片段。当滚动到下一个选项卡时,当前列表在下一个选项卡中可见,直到滚动被释放,然后片段重新绘制正确的列表。
我的问题是我是否采用了正确的方法来显示我的 ViewPager 片段中的列表?还是我真的把事情复杂化了?我对 ViewPagers 或 FragmentPagerAdapters 没有太多经验,因此非常感谢任何输入。
我的代码如下。
添加片段(从 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 class
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
中的片段。让片段自行管理它们的调用,就像您在单个片段上所做的那样 Activity
。这样,如果您想要适当的用户体验,您甚至可以在每个片段上显示和隐藏进度。我建议使用 Switcher
问题是可以单独调用吗?因为如果你做不到,那将是进行 3 次相同的大调用,这不是最明智的想法。在第二种情况下,您可以启动每个片段并让 activity 进行调用。对我来说,与 ViewPager
片段通信的首选解决方案是使用 events。您只需在 activity 中进行调用,并在加载后分别拆分数据并发送 3 个事件和其中的数据,让每个片段响应它们。只需在 onAttach
中注册到 EventBus 并在 onDetach
方法中注销