2013-04-18 115 views
42

我的尋呼機適配器(擴展PagerAdepter)中有一個textview。我用MainActivity的onPageSelected更新這個textview。其位置> 0的更新文本視圖,但起始頁面(位置0)不會在啓動時更新。當我向前滑動然後向後滑動;它設置位置0的值,但我不能將值設置爲ON START。如何設置星級頁面的值?onPageSelected不適用於第一頁

public void onPageSelected(int position) { 

      switch (position) { 
       case 0: 

        PagerAdapter.tv.setText("value"); // => doesnt work on start 

        break; 

          default: 
            PagerAdapter.tv.setText("value"); 
             break; 
} 
} 

全碼:

public class QuizStart extends SlidingFragmentActivity { 
@Override 
     protected void onCreate(final Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      this.setContentView(R.layout.activity_main); 

       mPager = (ViewPager)findViewById(R.id.pager);   
      QuestionPagerAdapter mAdapter = new QuestionPagerAdapter(); 

      mPager.setAdapter(mAdapter); 
      QuizStart.onPageSelected(0); 

     mPager.setOnPageChangeListener(new OnPageChangeListener() { 


      @Override 
      public void onPageScrollStateChanged(int arg0) { } 

      @Override 
      public void onPageScrolled(int arg0, float arg1, int arg2) { } 

      @Override 
      public void onPageSelected(int position) { 

      switch (position) { 
       case 0: 

        PagerAdapter.tv.setText("value"); // => doesnt work on start 

        break; 

          default: 
            PagerAdapter.tv.setText("value"); 
             break; 
       } 
      } 

     }); 
} 
} 
+0

爲什麼你PageAdapter有它的風景嗎?這聽起來很腥。你想達到什麼目的? – dmon 2013-04-18 03:52:50

+0

我從數據庫中獲取數據並將其設置爲paderadapters textview – metemet06 2013-04-18 03:58:35

回答

49

您可以手動調用onPageSelected(0)當您創建OnPageChangeListener設置開始狀態:

OnPageChangeListener pageChangeListener = new OnPageChangeListener() { 
    @Override 
    public void onPageScrollStateChanged(int arg0) { } 

    @Override 
    public void onPageScrolled(int arg0, float arg1, int arg2) { } 

    @Override 
    public void onPageSelected(int position) { 

     switch (position) { 
     case 0: 
      QuizStart.next.setText(getmycurrentpage()+""); 
      break; 

     default: 

      QuizStart.next.setText(getmycurrentpage()+""); 
      break; 
     } 
    } 
}); 

    mPager.setOnPageChangeListener(pageChangeListener); 
    // do this in a runnable to make sure the viewPager's views are already instantiated before triggering the onPageSelected call 
    mPager.post(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      pageChangeListener .onPageSelected(viewPager.getCurrentItem()); 
     } 
    }); 

編輯

現在它將會不克等Null Pointer exception通過如指出@ metemet06

+0

我該如何使用它?我找不到 – metemet06 2013-04-18 04:17:43

+0

緊跟在你的'viewPager.setAdapter(pagerAdapter)'後面,調用'pagerAdapter.onPageSelected(0)' – ianhanniballake 2013-04-18 04:43:17

+0

那麼我會在pagerAdapter中創建onPageSelected()方法嗎? – metemet06 2013-04-18 04:47:20

0

在我看來,你真的想要做什麼是壓倒一切的getPageTitle(),然後在其他地方,抓住該網頁標題並將其設置爲一個TextView的文本。

通過這種方式初始化您的活動,初始化PagerAdapter並致電getTitle(0)。這會讓你獲得頁面0的標題。現在在活動的textview中設置它。稍後,只要您更改頁面,只需撥打getTitle(newPosition)並更新該TextView即可。

0

您可能使用一些AsyncTasks來加載數據集,並且很難確定哪個任務是最後一個任務完成的。只有在完成最後一項任務後,當整個數據集完成時,您纔可以調用OnPageSelected,因爲它在整個數據集上對UI執行刷新。

而不是在第一次加載頁面時手動調用OnPageSelected函數,而是逐步建立「正常」UI。稍後,當用戶更改頁面時,數據集應該是完整的,並且保存在OnPageSelected函數中進行更新。

0

因爲我做了什麼,在這裏建議,並沒有工作,我將發佈什麼做的工作對我來說是將實體化功能onPageScrolled,像這樣:

@Override 
    public void onPageScrolled(int arg0, float arg1, int arg2) { 

      adapter.closeText(arg0, viewPager); 

    } 

也許它的工作的原因是onPagesScrolled會在android任務管理器的下方被激活,所以我們可以防止頁面被誇大的不需要的情況,並跳過視圖的偵聽器附件。

1

我通過在我的活動的onCreate()方法中添加應爲第一頁執行的代碼來修復了我的應用程序中的問題。

它不是最漂亮的黑客,並涉及一些冗餘的代碼,但因爲我只想在頁面更改時加載一些文本數據,所以對我來說這是最簡單的方法。

調用onPageSelected()手動導致NullPointerExceptions,只是das在上面的其他註釋中描述。

3

我的解決方案是擴展尋呼機適配器,並在其中創建一個接口。然後讓適配器在創建適配器後只調用一次接口。在界面回調裏,你可以調用onPageChanged方法而不會有nullpointerexception。將此類添加到您的項目並從中擴展您的適配器。在將適配器設置爲viewpager之前,不要忘記將監聽器設置爲適配器。適配器類如下:

public abstract class ExtendedPagerAdapter extends FragmentPagerAdapter { 

private boolean instantiated; 
private AdapterListener adapterListener; 

public interface AdapterListener { 
    void onAdapterInstantiated(); 
} 

public ExtendedPagerAdapter(FragmentManager fragmentManager) { 
    this(fragmentManager, null); 
} 

public ExtendedPagerAdapter(FragmentManager fragmentManager, AdapterListener adapterListener) { 
    super(fragmentManager); 
    this.adapterListener = adapterListener; 
    instantiated = false; 
} 

@Override 
public void finishUpdate(ViewGroup container) { 
    super.finishUpdate(container); 
    if (!instantiated) { 
     instantiated = true; 
     if (adapterListener != null) { 
      adapterListener.onAdapterInstantiated(); 
     } 
    } 
} 

public void setAdapterInstantiatedListener(AdapterListener adapterListener) { 
    this.adapterListener = adapterListener; 
} 
} 
+0

這是一個不錯的主意,在我的情況下完美!我想花更多的時間來研究在片段連接到活動之後是否實際調用了finishUpdate。 – Entreco 2016-05-25 07:30:04

+0

謝謝:)根據谷歌[FragmentPagerAdapter.finishUpdate](https://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html#finishUpdate(android.view.ViewGroup))被稱爲當所示頁面的更改已完成。所以,每當片段發生變化時,都會調用完成更新。此外,如果我們深入瞭解源代碼,我們可以看到這種方法提交併執行所有未完成的交易:) – 2016-05-25 07:39:45

+0

它值得更多upvotes – deviant 2017-10-06 15:52:15

0

此代碼適用於我。首先初始化pagechange偵聽器。 setCurrentItem之後。

viewPager.setAdapter(adapter); 
     viewPager.setOffscreenPageLimit(1); 

     final ViewPager.OnPageChangeListener listener = new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
     } 

     @Override 
     public void onPageSelected(int position) { 

     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 
     } 
     }; 
     viewPager.addOnPageChangeListener(listener); 
     viewPager.setCurrentItem(position); 
25

工作對我來說下一個代碼

viewPager.addOnPageChangeListener(myOnPageChangeListener); 

ViewPager.OnPageChangeListener myOnPageChangeListener = new ViewPager.OnPageChangeListener() { 

    //declare key 
    Boolean first = true; 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
     if (first && positionOffset == 0 && positionOffsetPixels == 0){ 
      onPageSelected(0); 
      first = false; 
     } 
    } 

    @Override 
    public void onPageSelected(int position) { 
     //do what need 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) { 
    } 
}; 
+0

這是一個很好的技巧,可以輕鬆解決問題。 – GregM 2017-03-02 16:02:39

0

其實我找到了一個很好的方法基於這個answer

問題是當設置偵聽器時ViewPager未完全加載,第一個頁面被調用,但ViewPager中的片段尚未完全初始化。

爲了解決這個問題我只是保持一個變量知道,如果第一頁被稱爲與否:

private boolean mFirstPageCalled = false; 
聽者

然後:

@Override 
public void onPageSelected(int position) { 

    if(mFirstPageCalled) { 
     // Do your thing 
    } else { 
     mFirstPageCalled = true; 
    } 
} 

的最後一件事要做是處理已被遺漏的第一頁,這可以在ViewPager完全創建時完成:

mViewPager.post(new Runnable(){ 
     @Override 
     public void run() { 
      // Do your thing 
     } 
    }); 

在我來說,我只是叫回來這裏的當前片段顯示,並在其上工作:

Fragment currentFragment = mPagerAdapter.instantiateItem(mViewPager, mViewPager.getCurrentItem()); 
currentFragment.customAction(); 

post方法只調用一次,如此完美處理的第一頁的情況。

0

我的解決辦法是延長ViewPager

class MyViewPager extends ViewPager { 

    private List<OnPageChangeListener> _Listeners = new ArrayList<>(); 

    public MyViewPager(Context context) { 
     super(context); 
    } 

    public MyViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    public void addOnPageChangeListener(OnPageChangeListener listener) { 
     super.addOnPageChangeListener(listener); 
     _Listeners.add(listener); 
    } 

    @Override 
    public void removeOnPageChangeListener(OnPageChangeListener listener) { 
     super.removeOnPageChangeListener(listener); 
     _Listeners.remove(listener); 
    } 

    @Override 
    public void setCurrentItem(final int item) { 
     if (item != getCurrentItem()) { 
      super.setCurrentItem(item); 
     } else { 
      post(new Runnable() { 
       @Override 
       public void run() { 
        dispatchOnPageSelected(item); 
       } 
      }); 
     } 
    } 

    private void dispatchOnPageSelected(int position) { 
     for (int i = 0, size = _Listeners.size(); i < size; i++) { 
      OnPageChangeListener listener = _Listeners.get(i); 
      if (listener != null) { 
       listener.onPageSelected(position); 
      } 
     } 
    } 
} 
相關問題