刷卡时ViewPager更新片段

我有一个问题,我一直在过去2天挣扎。

我正在构build一个使用ActionBar,ViewPager&FragmentPagerAdapter的应用程序。 Activity,Fragments&FragmentPagerAdapter的代码与http://developer.android.com/reference/android/support/v4/view/ViewPager.html上的android示例中的代码完全相同

我面临的问题是 – 假设我在viewPager中只有2个片段。 当在两者之间切换/滑动时,碎片没有被更新。 onResume不会被调用,因为viewPager会在显示片段的任一侧caching至less1个片段。

我尝试使用onTabSelected来检测何时select了一个片段,然后借助于一个接口(下面的代码)从该片段开始一个方法。

public void onTabSelected(Tab tab, FragmentTransaction ft) { TabInfo tag = (TabInfo)tab.getTag(); for (int i=0; i<mTabs.size(); i++) { if (mTabs.get(i) == tag) { mViewPager.setCurrentItem(i); } } ((IStartStop)getItem(tab.getPosition())).Start(); } 

但是,使用Start方法时尝试更新文本视图触发NullPointerException。 启动方法的代码是:

 public void Start() { TextView tv = _view.findViewById(R.id.text); tv.setText("test"); } 

例外情况如下:

 TextView tv = _view.findViewById(R.id.text); 

IStartStop接口非常简单:

 public interface IStartStop { public void Start(); public void Stop(); } 

我不想使用notifyDataSetChanged(); 与POSITION_NONE因为每次我刷新一个片段,它需要几秒钟来加载片段

在这个时候,片段只包括一个textview,将来他们将会有一个animation,所以重要的是:

1-仅在select片段时运行animation,而不select片段旁边的片段(ViewPagercaching和恢复片段的方式)。

2-不再select分片时停止animation,避免浪费设备资源。

是的,我已经检查了互联网上可用的一切,但似乎没有任何工作与我。

非常感谢您的帮助!

Solutions Collecting From Web of "刷卡时ViewPager更新片段"

令人惊讶的是ViewPager不会“本地”(除其他外)。 但是并不是所有人都失去了

首先,你必须修改你的片段,这样当你告诉他们可以,而不是实例化时,他们只能运行animation。 这样你可以玩viewpager偏移(默认= 3),并有2-3个片段预加载,但不是animation。

第二步是创build一个接口或类似的定义“片段变得可见”的时间。

第三步是将一个新的OnPageScrollListener附加到你的viewpager。

代码如下(在半未经testing的代码中):

1)附上听众:

 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) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Override public void onPageScrollStateChanged(final int i) { } }); 

2)这是你的接口:

 public interface YourFragmentInterface { void fragmentBecameVisible(); } 

3)改变你的片段,以便他们实现这个:

 public class YourLovelyFragment extends Fragment implements YourFragmentInterface { 

4)在片段中实现接口

 @Override public void fragmentBecameVisible() { // You can do your animation here because we are visible! (make sure onViewCreated has been called too and the Layout has been laid. Source for another question but you get the idea. } 

然后去哪儿?

你可能想要实现一个方法/侦听器来通知“其他”片段,他们不再可见(即当一个是可见的,其他的不是)。 但是这可能不需要。

这将影响查看寻呼机从一个页面到另一个页面的变化。

 OnPageChangeListener pagechangelistener =new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { Logger.logMessage("Called first"); pageAdapter.notifyDataSetChanged(); indicator.setCurrentItem(arg0); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { Logger.logMessage("Called second"); } @Override public void onPageScrollStateChanged(int arg0) { Logger.logMessage("Called third"); } }; myViewPager.setOnPageChangeListener(pagechangelistener); 

在你的页面适配器中使用它。

 @Override public int getItemPosition(Object object) { return POSITION_NONE; } 

setOnPageChangeListener已被弃用。 相反,你应该使用addOnPageChangeListener。

 mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(final int i, final float v, final int i2) { } @Override public void onPageSelected(final int i) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Override public void onPageScrollStateChanged(final int i) { } }); 

定义Viewpager时添加此代码

 mViewPager.setOffscreenPageLimit(0); 

当您切换到其他片段时,它不会保存片段的任何视图。因此,从片段切换到另一个片段将从头创build片段并更新所有内容。