首页 文章

轻扫时ViewPager更新片段

提问于
浏览
26

我有一个问题,我过去2天一直在努力 .

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

我面临的问题是 - 假设我在viewPager中只有2个片段 . 当在两者之间切换/滑动时,片段不会更新 . onResume不会被调用,因为viewPager将至少1个片段缓存到显示片段的任一侧 .

我尝试使用onTabSelected来检测何时选择了一个片段,然后在接口的帮助下从该片段启动一个方法(下面的代码) .

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方法时,尝试更新textview时会触发NullPointerException . start方法的代码是:

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,将来他们会有一个动画,所以重要的是:

1-仅在选择片段时运行动画,而不是在选择其旁边的片段时运行动画(ViewPager缓存和恢复片段的方式) .

2-当不再选择片段时停止动画以避免浪费设备资源 .

是的,我已经检查了互联网上的所有可用内容,但似乎没有任何关系 .

非常感谢您的帮助!

4 回答

  • -7

    令人惊讶的是 ViewPager 并没有这样做"natively"(除其他外) . 但并非所有人都失去了 .

    首先,您必须修改片段,以便它们只在您告诉它们没有实例化时才会运行动画 . 通过这种方式,您可以使用viewpager偏移量(默认值= 3)并预装2-3个片段,但不会设置动画 .

    第二步是创建一个定义“片段何时可见”的界面或类似物 .

    第三步是将新的OnPageScrollListener附加到您的viewpager .

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

    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.
    }
    

    Where to go from here?

    您可能希望实现一个方法/侦听器来通知“其他”片段它们不再可见(即,一个可见,其他则不可见) . 但这可能不需要 .

  • 53

    这将影响视图寻呼机中从一个页面到另一个页面的更改 .

    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;
        }
    
  • 2

    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) {
            }
        });
    
  • 4

    定义Viewpager时添加此代码

    mViewPager.setOffscreenPageLimit(0);
    

    切换到其他片段时,它不会保存片段的任何视图..因此从片段切换到另一个片段将从开始创建片段并更新所有片段 .

相关问题