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

首頁 > 學院 > 開發設計 > 正文

Material Design中的一些趣事

2019-11-09 19:00:51
字體:
來源:轉載
供稿:網友

序言:前兩天接到一個任務,說是要實現一個類似下面這樣的界面:

當然了,這個是我完成任務之后又寫的一個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>

看起來挺蠻煩的哈,但是為了要達到上面那種效果,也是沒啥辦法了。布局寫完之后,我們來完成viewpagerFragment的結合。我們的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中的內容拉到正常狀態再進行刷新,詳細解決方案請參考

CoordinatorLayout AppBarLayout 結合下拉刷新 上拉加載更多 的滑動沖突解決

也就是說我們需要監聽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有很多,大家可以百度試著寫寫看,遇到什么問題再來看看這篇文章。

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

這是我建的一個android小白的群,各位有興趣的小白歡迎加群共同學習,也歡迎各位大神進群指導,共勉。群號:541144061


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳信县| 景谷| 丰顺县| 南溪县| 台山市| 安溪县| 巴塘县| 大田县| 天水市| 湖北省| 开平市| 石城县| 外汇| 鹿泉市| 涞源县| 龙游县| 开化县| 东丰县| 山东| 界首市| 游戏| 高邮市| 个旧市| 沁水县| 尖扎县| 会宁县| 荃湾区| 文化| 屏南县| 台山市| 邹平县| 农安县| 宁波市| 清苑县| 雷山县| 深州市| 大悟县| 仙桃市| 永仁县| 如东县| 永吉县|