
當(dāng)然了,這個(gè)是我完成任務(wù)之后又寫的一個(gè)demo,大家可能會(huì)想到這里用的是谷歌極力推薦我們使用的一個(gè)全新的設(shè)計(jì)語(yǔ)言——Material Design,然后再配上谷歌的下拉刷新控件SwipeRefreshLayout,沒錯(cuò),這里我們就是這樣干的,因?yàn)橹挥幸粋€(gè)刷新,卻有三個(gè)頁(yè)面,所以這里還有一個(gè)需要注意的地方就是刷新之后三個(gè)頁(yè)面的數(shù)據(jù)分配問(wèn)題,待會(huì)我們?cè)賮?lái)講這個(gè)問(wèn)題。
首先我們來(lái)看布局,最上面是我們自己的一個(gè)標(biāo)題欄,往下圖片那一整塊我用的是toolbar,里面包含了整個(gè)的頭部信息,再往下面是一個(gè)Tablayout,里面是三個(gè)tab,最下面放的是三個(gè)fragment
好了,我們來(lái)看看布局信息
<android.support.v4.widget.SwipeRefreshLayout> <android.support.design.widget.CoordinatorLayout> <android.support.design.widget.AppBarLayout> <android.support.v7.widget.Toolbar> 整個(gè)頭部(標(biāo)題欄以下) </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>看起來(lái)挺蠻煩的哈,但是為了要達(dá)到上面那種效果,也是沒啥辦法了。布局寫完之后,我們來(lái)完成viewpager和Fragment的結(jié)合。我們的ViewPager需要一個(gè)FragmentPagerAdapter來(lái)填充,在adapter中我們需要注意的是Fragment一定要寫成員變量,切記不可在getItem方法中返回的時(shí)候直接new一個(gè)Fragment對(duì)象,這樣你會(huì)后悔的,因?yàn)橄挛奈覀円v到刷新之后數(shù)據(jù)分配的問(wèn)題,下面我們?cè)僬f(shuō)。
@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; }}然后呢,我們就要實(shí)現(xiàn)刷新的功能了,刷新的時(shí)候我們還需要注意一點(diǎn),就是當(dāng)你把toolbar里面的內(nèi)容(也就是整個(gè)頭部)頂上去之后,再下拉,它會(huì)立馬進(jìn)行刷新,不會(huì)等到你把toolbar中的內(nèi)容拉到正常狀態(tài)再進(jìn)行刷新,詳細(xì)解決方案請(qǐng)參考
也就是說(shuō)我們需要監(jiān)聽appbarlayout的滾動(dòng)
appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { if (verticalOffset >= 0) { swipeRefreshLayout.setEnabled(true); } else { swipeRefreshLayout.setEnabled(false); } }});這樣我們就不用擔(dān)心還沒有將toolbar的內(nèi)容全都拉下來(lái)就執(zhí)行刷新了,這里效果圖我們就不放了,有興趣的哥們可以自己嘗試一把。接下來(lái)我們來(lái)看刷新之后數(shù)據(jù)分配的地方,這里我們使用set方式直接將數(shù)據(jù)設(shè)置到Fragment中的方法中,然后再由Fragment中的方法進(jìn)行數(shù)據(jù)的展示。
首先,在Activity中,我們可以根據(jù)ViewPager.getCurrentItem()方法來(lái)判斷我們處于哪個(gè)fragment中,然后我們?cè)?strong>Fragment中寫set方法:
public void setDatas(List<String> datas) { mDatas.addAll(0, datas); mAdapter.notifyDataSetChanged();}這樣方便在Activity中調(diào)用。這里可能就有人要問(wèn)了,我拿到了數(shù)據(jù),知道了是哪一個(gè)fragment,但是我怎么獲取fragment對(duì)象呢?別急,我們還有一個(gè)FragmentPagerAdapter嘛!根據(jù)adapter.getItem(position)我們就可以獲取fragment,注意注意注意,重要的事情說(shuō)三遍,上面我們說(shuō)到不能在adapter中的getItem方法中返回的時(shí)候直接new一個(gè)對(duì)象,因?yàn)槲覀兠看卧?strong>Activity中調(diào)用adapter.getItem的時(shí)候adapter都會(huì)創(chuàng)建一個(gè)新的Fragament對(duì)象,然后你之前初始化過(guò)的一些東西就會(huì)沒了,然后當(dāng)你設(shè)置數(shù)據(jù)的時(shí)候就回空指針了
來(lái)看一下我們?nèi)绾握{(diào)用set方法:
((Fragment) FragmentPagerAdapter.getItem(position)).setDatas(datas);這一篇主要講的是在做這個(gè)效果的時(shí)候所需要注意的地方,怎么做的在這里就不細(xì)講了,往上的demo有很多,大家可以百度試著寫寫看,遇到什么問(wèn)題再來(lái)看看這篇文章。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注