1. 程式人生 > >ViewPager+Fragment支援導航滑動以及點選切換,觸發替換某個tab對應的fragment

ViewPager+Fragment支援導航滑動以及點選切換,觸發替換某個tab對應的fragment

每天積累一點點,時間久了,你就是大牛了
    最近專案中要改造首頁導航欄,框架是用ViewPager+Fragment做的。導航欄中有一項fragment不固定,進入首頁前如果伺服器資料訪問到了並且傳進來了就會指明要展示的fragment。如果沒有訪問到資料就先展示預設的,待伺服器資料訪問到時再發個廣播將該tab的預設fragment替換成需要的fragment。以下是我的解決辦法,後面有我寫的demo,有需要的可以去下載。 先晒下demo效果圖: 如下圖一,有tab1,tab2兩個選項,分別對應兩個fragment頁面tab1
fragment和tab2fragment,當點選1位置時tab2的fragment資源變成了由tab2
fragment變成了tab3fragment頁面,如下圖二為點選1位置後頁面切換情況。
                                    圖一                                                                    
 圖二


接下來上程式碼,一步步解析實現過程:

第一步:下圖三為demo結構,下圖四為開始進入時初始化的tab1和tab2的fragment資源,所以開始點選tab1和tab2或者滑動時顯示的是這兩個頁面。

                            圖三                                                                                         圖四


第二步:當點選圖一中1位置時觸發下圖中的方法替換tab2的由tab2fragment為tab3fragment,通過下圖中3方法觸發adapter中方法替換頁面。

                                                      圖五


第三步:在adapter中先通過flags標記需要替換的選項,然後呼叫notifyDatasetChanged();方法,重新載入頁面,需要注意的是要重寫方法  public int getItemPosition(Object object) {return PagerAdapter.POSITION_NONE;}返回值設為PagerAdapter.POSITION_NONE。在 PagerAdapter 中的實現是直接傳回 POSITION_UNCHANGED。如果該函式不被過載,則會一直返回 POSITION_UNCHANGED,從而導致 ViewPager .dataSetChanged() 被呼叫時,認為不必觸發 PagerAdapter.instantiateItem()。很多人因為沒有過載該函式, 而導致呼叫PagerAdapter.notifyDataSetChanged() 後,什麼都沒有發生。

                                                                           圖六



第四步:接下來就是呼叫圖六中的2位置方法了,註釋都很清楚就不詳敘了
原始碼地址:點此進入原始碼介面