簡體   English   中英

輕掃時ViewPager更新片段

[英]ViewPager update fragment on swipe

我有一個問題,我在過去兩天一直在努力。

我正在構建一個使用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-當不再選擇片段時停止動畫以避免浪費設備資源。

是的,我已經檢查了互聯網上的所有可用內容,但似乎沒有任何關系。

非常感謝您的幫助!

令人驚訝的是, ViewPager不會“本地”(除此之外)這樣做。 但並非所有人都失去了。

首先,您必須修改片段,以便它們只在您告訴它們沒有實例化時才會運行動畫。 通過這種方式,您可以使用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.
}

然后去哪兒?

您可能希望實現一個方法/偵聽器來通知“其他”片段它們不再可見(即,一個可見,其他不可見)。 但這可能不需要。

這將影響視圖尋呼機中從一個頁面到另一個頁面的更改。

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);

切換到其他片段時,它不會保存片段的任何視圖..因此從片段切換到另一個片段將從開始創建片段並更新所有片段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM