
當然了,這個是我完成任務之后又寫的一個demo,大家可能會想到這里用的是谷歌極力推薦我們使用的一個全新的設計語言——Material Design,然后再配上谷歌的下拉刷新控件SwipeRefreshLayout,沒錯,這里我們就是這樣干的,因為只有一個刷新,卻有三個頁面,所以這里還有一個需要注意的地方就是刷新之后三個頁面的數據分配問題,待會我們再來講這個問題。
首先我們來看布局,最上面是我們自己的一個標題欄,往下圖片那一整塊我用的是toolbar,里面包含了整個的頭部信息,再往下面是一個Tablayout,里面是三個tab,最下面放的是三個fragment
好了,我們來看看布局信息
<android.support.v4.widget.SwipeRefreshLayout> <android.support.design.widget.CoordinatorLayout> <android.support.design.widget.AppBarLayout> <android.support.v7.widget.Toolbar> 整個頭部(標題欄以下) </android.support.v7.widget.Toolbar> </android.support.design.widget.AppBarLayout> <LinearLayout> <android.support.design.widget.TabLayout> </android.support.design.widget.TabLayout> <android.support.v4.view.ViewPager> </android.support.v4.view.ViewPager> </LinearLayout> </android.support.design.widget.CoordinatorLayout></android.support.v4.widget.SwipeRefreshLayout>看起來挺蠻煩的哈,但是為了要達到上面那種效果,也是沒啥辦法了。布局寫完之后,我們來完成viewpager和Fragment的結合。我們的ViewPager需要一個FragmentPagerAdapter來填充,在adapter中我們需要注意的是Fragment一定要寫成員變量,切記不可在getItem方法中返回的時候直接new一個Fragment對象,這樣你會后悔的,因為下文我們要講到刷新之后數據分配的問題,下面我們再說。
@Overridepublic Fragment getItem(int position) { if (position == 1) { if (fragmentTwo == null) { fragmentTwo = new FragmentTwo(); } return fragmentTwo; } else if (position == 2) { if (fragmentThree == null) { fragmentThree = new FragmentThree(); } return fragmentThree; } else { if (fragmentOne == null) { fragmentOne = new FragmentOne(); } return fragmentOne; }}然后呢,我們就要實現刷新的功能了,刷新的時候我們還需要注意一點,就是當你把toolbar里面的內容(也就是整個頭部)頂上去之后,再下拉,它會立馬進行刷新,不會等到你把toolbar中的內容拉到正常狀態再進行刷新,詳細解決方案請參考
也就是說我們需要監聽appbarlayout的滾動
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if (verticalOffset >= 0) { swipeRefreshLayout.setEnabled(true); } else { swipeRefreshLayout.setEnabled(false); } }});這樣我們就不用擔心還沒有將toolbar的內容全都拉下來就執行刷新了,這里效果圖我們就不放了,有興趣的哥們可以自己嘗試一把。接下來我們來看刷新之后數據分配的地方,這里我們使用set方式直接將數據設置到Fragment中的方法中,然后再由Fragment中的方法進行數據的展示。
首先,在Activity中,我們可以根據ViewPager.getCurrentItem()方法來判斷我們處于哪個fragment中,然后我們在Fragment中寫set方法:
public void setDatas(List<String> datas) { mDatas.addAll(0, datas); mAdapter.notifyDataSetChanged();}這樣方便在Activity中調用。這里可能就有人要問了,我拿到了數據,知道了是哪一個fragment,但是我怎么獲取fragment對象呢?別急,我們還有一個FragmentPagerAdapter嘛!根據adapter.getItem(position)我們就可以獲取fragment,注意注意注意,重要的事情說三遍,上面我們說到不能在adapter中的getItem方法中返回的時候直接new一個對象,因為我們每次在Activity中調用adapter.getItem的時候adapter都會創建一個新的Fragament對象,然后你之前初始化過的一些東西就會沒了,然后當你設置數據的時候就回空指針了
來看一下我們如何調用set方法:
((Fragment) FragmentPagerAdapter.getItem(position)).setDatas(datas);這一篇主要講的是在做這個效果的時候所需要注意的地方,怎么做的在這里就不細講了,往上的demo有很多,大家可以百度試著寫寫看,遇到什么問題再來看看這篇文章。
新聞熱點
疑難解答