国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Material Design中的一些趣事

2019-11-09 18:19:48
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

序言:前兩天接到一個(gè)任務(wù),說(shuō)是要實(shí)現(xiàn)一個(gè)類似下面這樣的界面:

當(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)完成viewpagerFragment的結(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)參考

CoordinatorLayout AppBarLayout 結(jié)合下拉刷新 上拉加載更多 的滑動(dò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)看看這篇文章。

demo已傳至GitHub,有需要的同學(xué)歡迎下載,star

這是我建的一個(gè)android小白的群,各位有興趣的小白歡迎加群共同學(xué)習(xí),也歡迎各位大神進(jìn)群指導(dǎo),共勉。群號(hào):541144061


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 太原市| 石柱| 铅山县| 定远县| 得荣县| 伊宁市| 邵阳市| 舟曲县| 贵溪市| 德昌县| 乐清市| 眉山市| 银川市| 木兰县| 准格尔旗| 双峰县| 紫阳县| 阿勒泰市| 洛南县| 井冈山市| 宁城县| 共和县| 屯昌县| 湄潭县| 新邵县| 吉隆县| 连山| 潮州市| 芮城县| 无棣县| 兴仁县| 梁河县| 雷山县| 徐水县| 通化县| 藁城市| 纳雍县| 昌图县| 德令哈市| 浦江县| 伊通|