Recycleview實現複雜頁面 三種以上佈局 瀑布流 多佈局 scrollview巢狀recyclerView 顯示不全 滑動衝突 之進階終極篇 (轉載)
===============================================================================================
相信很多安卓開發的朋友,尤其是剛從事安卓開發的朋友, 當產品經理遞過來一張複雜頁面的設計圖時 , 都會有一種茫然的感覺 , 在心裡想著如何實現 , 然後網上搜索如何實現複雜佈局頁面,當初我也是這麼過來的, 可以說踩了很多很大的坑 , 所以決定寫下這篇部落格 , 供各位猿猿參觀 , 想相信看完此篇 , 絕對是最後一篇 , 不用再找了 , 當然 此篇為進階篇 。 如果你對recycleview 還不熟悉
言歸正傳, 先來看一下效果圖:
gif錄出來 有點怪 , 所以就截圖了,原始碼已放入github
下面我來分析一下這種複雜介面的具體實現思路, 當然這裡非常感謝 liaoinstan 大神的文章 http://blog.csdn.net/liaoinstan/article/details/52671101,朋友可以看一下 , 最初我也是看了此篇 , 但是此篇並非完美, 在此我進一步總結一下 。
首先我們來做一個分水嶺, 就是佈局中上拉載入的佈局是否是瀑布流,
1、如果不是瀑布流, 那就很簡單了,借鑑一下
如果實現此圖, liaoinstan給瞭如下兩種方案,
第一種:
這裡recycleview5 應該還是列表管理器, 懶得畫圖了,意思一樣 。
這種方案構思就是recycleview裡面巢狀多recycleview,構思簡單,編寫也是行如流水,能夠實現需求,但是問題來了,以下是重點,這種多巢狀的寫法,在上拉載入的時候,拉到後面基本就會很卡,就算釋放glide(或者其他圖片載入框架)的記憶體也是釋放不掉,直至oom或者卡死不動,所以這種巢狀思路只適合沒有載入更多的的情況。
第二種:
這中思路里面最重要的方法就是
- @Override
- publicvoid onAttachedToRecyclerView(
- super.onAttachedToRecyclerView(recyclerView);
- RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
- if(manager instanceof GridLayoutManager) {
- final GridLayoutManager gridManager = ((GridLayoutManager) manager);
- gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
- @Override
- publicint getSpanSize(int position) {
- int type = getItemViewType(position);
- switch (type){
- case TYPE_SLIDER:
- case TYPE_TYPE2_HEAD:
- case TYPE_TYPE3_HEAD:
- return6;
- case TYPE_TYPE2:
- return3;
- case TYPE_TYPE3:
- return2;
- default:
- return3;
- }
- }
- });
- }
- }
2.如果需求是帶瀑布流的
那麼,第一種情況裡面的 onAttachedToRecyclerView方法瀑布流管理器裡面就不存在,因此無法使用,只能另尋他法,liaoinstan大神推薦TwowayView能實現上圖這種效果,但是, 呵呵,不好意思,當你用TwowayView寫實際應用時, 需要網路載入時, 問題出現了,那就是你來回下拉重新整理幾次,佈局上面就會有一塊白的空白區域, 直至最後你的佈局完全看不見, 只剩下一片白 ,我沒有解決此問題。當時我寫我們公司的應用時, 寫到這裡的時候,我就一臉懵逼了, 然後就用最最古老的辦法,直接scrollview裡面巢狀幾個recycleview,寫到最後還是意料之中出現問題了,上拉載入到最後還是會卡頓,而且在6.0以上 高度總是有問題。
到這裡,我差點想和產品說我們不用瀑布流好不好,但我又從新搜了一下,在瀑布流管理器裡面有LayoutParams.setFullSpan(true);方法,在
- onCreateViewHolder(ViewGroup parent, int viewType)
總體思路就是,把下面的瀑布流部分作為一種type,其他無需載入更多的佈局放在recycleview裡面
使用此方法使這一行佔滿全屏,這是我到現在總結出來的最好實現方式。
思路圖如下:
部分程式碼如下
- @Override
- public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- if (viewType == TYPE_TOP) {
- //頭部輪播圖
- View viewtop = inflater.inflate(R.layout.adapter_slider, parent, false);
- StaggeredGridLayoutManager.LayoutParams params =
- (StaggeredGridLayoutManager.LayoutParams) viewtop.getLayoutParams();
- params.setFullSpan(true);//最為重要的一個方法,佔滿全屏,以下同理
- viewtop.setLayoutParams(params);
- returnnew TypeTopsliderHolder(viewtop);
- } elseif (viewType == TYPE_HEADER) {
- View view2 = inflater.inflate(R.layout.item_homepagertypeheader_type, parent, false);
- StaggeredGridLayoutManager.LayoutParams params =
- (StaggeredGridLayoutManager.LayoutParams) view2.getLayoutParams();
- params.setFullSpan(true);
- view2.setLayoutParams(params);
- returnnew TypeheadHolder(view2);
- } elseif (viewType == TYPE_CENTER) {
- //中間head下面的佈局
- View view = inflater.inflate(R.layout.itam_homepageradapter_rv2, parent, false);
- StaggeredGridLayoutManager.LayoutParams params2 =
- (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
- params2.setFullSpan(true);
- view.setLayoutParams(params2);
- returnnew TypetypeHolder2(view);
- } elseif (viewType == TYPE_CATEGORY) {
- //四個快速入口的holder
- //這裡的TypetypeHolder和上面的TypetypeHolder2 其實可以寫成一個holder,這裡為了簡單,避免引起復用帶來的問題,分開了
- View view = inflater.inflate(R.layout.itam_homepageradapter_rv2, parent, false);
- StaggeredGridLayoutManager.LayoutParams params2 =
- (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
- params2.setFullSpan(true);
- view.setLayoutParams(params2);
- returnnew TypetypeHolder(view);
- } elseif (viewType == TYPE_REFRESH) {
- returnnew TypeRefresh(inflater.inflate(R.layout.item_raiders2, parent, false));
- } else {
- View viewtop = inflater.inflate(R.layout.adapter_slider, parent, false);
- StaggeredGridLayoutManager.LayoutParams params =
- (StaggeredGridLayoutManager.LayoutParams) viewtop.getLayoutParams();
- params.setFullSpan(true);
- viewtop.setLayoutParams(params);
- returnnew TypeTopsliderHolder(viewtop);
- }
- }
這個方法 在大神的文章裡 只是 副作用的 提了一下, 光想著TwowayView 了 所以沒在意 ,最後還是此方法解決了這種需求。
我的線上專案為[空藝術,朋友可以點選下載看一下效果](http://a.app.qq.com/o/simple.jsp?pkgname=com.happyo2o.artexhibition),首頁就是這個原理實現的,大家可以看一下效果。
總結:本人只是理論性的總結了複雜佈局的實現方式,以及一些坑 , 避免各位浪費時間和精力 ,鄙人在此獻醜了,程式碼已經全部上傳,github專案原始碼 歡迎star , 轉載 , 萬分感謝 。
相關推薦
Recycleview實現複雜頁面 三種以上佈局 瀑布流 多佈局 scrollview巢狀recyclerView 顯示不全 滑動衝突 之進階終極篇 (轉載)
=============================================================================================== 相信很多安卓開發的朋友,尤其是剛從事安卓開發的朋友, 當產品經理遞過來一張複雜頁面的
工作小記~~~使用LinearLayout實現仿ListView(解決巢狀ListView顯示不全)
使用LinearLayout實現仿ListView(解決巢狀ListView顯示不全) 滑動控制元件巢狀ListView時就會出現ListView中的資料顯示不全的現象,這時我們就會想到巢狀NoScrollListView去實現。功能是可以實現但是在列表中
Android 混排效果之 ScrollView 巢狀 RecyclerView 巢狀gridview 實現listview 巢狀gridview 效果
RecyclerView 出現以後 很受大家歡迎 漂亮流暢的列表 簡單的操作 可以幫我們完成很多的列表 但是有一種listview 巢狀gridview 的效果 目前還是需要巢狀才能完成 現在就簡單說一下我的思路 本人的需求是例如手機淘寶頁 本人使用老套的實現模
ScrollView巢狀RecyclerView,RecyclerView總是把它上面的控制元件頂出頁面(頁面出現自己滾動)
ScrollView巢狀RecyclerView,當我離開當前頁面,然後又回來時,RecyclerView就會把它上邊的控制元件都擠出頁面,它顯示在頁面最上邊。 原因應該是RecyclerView搶了焦點,只需要把ScrollView中最上邊的那個控制元件加上幾句程式碼
ScrollView巢狀RecyclerView、ScrollView巢狀Listview、ScrollView巢狀各種佈局,預設不在頂部和回到頂部的解決方法;
如果:ScrollView.scrollTo(0,0);ScrollView.fullScroll(View.FOCUS_UP) ;ScrollView.smoothScrollTo(0, 0);這三種方法都解決不了你的問題,那麼請往下看;佈局有點複雜:最外層是SwipeRe
解決6.0以上ScrollView巢狀RecyclerView能同時滑動的問題。
在4.X的版本中ScrollView巢狀RecyclerView只需要重寫LinearLayoutManager即可,同時還解決了顯示不全的問題,具體實現如下: import java.lang.reflect.Field; import android.content.
通過例子進階學習C++(七)CMake專案通過模板庫實現約瑟夫環
本文是通過例子學習C++的第七篇,通過這個例子可以快速入門c++相關的語法。 1.問題描述 回顧一下約瑟夫環問題:n 個人圍坐在一個圓桌周圍,現在從第 s 個人開始報數,數到第 m 個人,讓他出局;然後從出局的下一個人重新開始報數,數到第 m 個人,再讓他出局......,如此反覆直到所有人全部出局為止。 上
RecycleView 實現複雜首頁佈局三種方式
做過電商類應用的朋友可能都會遇到一個比較頭疼的問題:複雜的首頁佈局如何實現。參考百度糯米,美團,bilibili等應用,都會發現其首頁的佈局相對複雜,例如下圖bilibili的首頁(第二張是demo實現的效果圖),可以看到在同一個頁面中先是有列表佈局出現,然後出現了2列的網格
前臺頁面與後臺servlet實現登入的三種實現方式
第一種:action獲取資料在servlet實現轉發處理實現登入 前臺頁面 <form action="Hasdf" method="get">賬號:<input type="tex
javascript實現繼承的三種方式
定義 數列 .net 一個數 str www div name type屬性 一、原型鏈繼承 function Parent(){} function Child(){} Child.prototype = new Parent(); 通過對象child的p
使用leetcode輪子快速實現樹的三種遍歷
樹的前中後序遍歷 最近發現,leetcode的除錯面板真是個神器,可以新增各種函式 最近想實現樹的三種遍歷,想想自己寫輸入輸出函式就累(對不起我不是合格程式設計師orz 嚶嚶嚶於是就到leetcode上抄了函式改了下,看了下實現方式其實也不是很難(站著說話ing))
一、多執行緒基礎概念、實現執行緒三種方法、中斷執行緒方法,以及執行緒狀態轉化
1、CPU核心數和執行緒數的關係 1:1的關係,引入超執行緒之後,就是1:2 2、cpu時間輪轉機制,即RR排程 3、程序和執行緒 程序:程式執行資源分配最小單位,程序內部有多個執行緒,多個執行緒之間會共享程序資源 執行緒:CPU排程的最小單位 4、並行和併發
前端實現三角形的三種方法
直接貼程式碼行不行?我是個不善於表達的姑娘QAQ 第一種 HTML+CSS <div class="box"></div> <style> .box{
RecyclerView實現複雜頁面
近日,三星Galaxy S8正式釋出,使用了曲屏無邊超大螢幕,屏佔比高達84%。為了獲得更大的屏佔比,S8甚至取消了正面指紋識別的設計,將指紋識別移到了後置攝像頭右側。另外還增加了語音助手Bixby,對蘋果Siri的進行公開叫板。不知道這一旗艦機型能否挽回去年“炸彈”Note
實現Servlet的三種方式(與GenericServlet、HttpServlet的關係)
WEB伺服器可以存放資料,他是一個“容器”,作用是接收使用者的請求,再對這個請求做出相應。 Java的Web伺服器必須要支援JSP/Servlet(作為JSP/Servlet的容器)。 所以JSP/Servlet就是JavaWeb伺服器的一套規範。 所以要進行J
OkHttp網路獲取資料通過RecycleView展示,實現ListView,GridView(網格佈局),瀑布流效果展示
因為涉及到網路請求資料 那麼首先我們先要在清單檔案 新增網路許可權,已經註冊MyApp(設定圖片的自定義類,需要註冊) <uses-permission android:name="android.permission.INTERNET"/>
Java實現克隆的三種方式
1. 淺克隆 2. 深克隆 3. 利用序列化實現深克隆 1、淺複製(淺克隆)這種淺複製,其實也就是把被複制的這個物件的一些變數值拿過來了。最後生成student2還是一個新的物件。 public class
單鏈表實現反轉的三種方法
單鏈表的操作是面試中經常會遇到的問題,今天總結一下反轉的幾種方案: 1 ,兩兩對換 2, 放入陣列,倒置陣列 3, 遞迴實現 程式碼如下: #include<stdio.h> #include<malloc.h> typ
python核心高階學習總結3-------python實現程序的三種方式及其區別
python實現程序的三種方式及其區別 在python中有三種方式用於實現程序 多程序中, 每個程序中所有資料( 包括全域性變數) 都各有擁有⼀份, 互不影響 1.fork()方法 ret = os.fork() if ret == 0: #子程序 else:
jsp頁面引入(引入其他jsp頁面)三種方式
可以先看一下這個頁面:http://www.ibm.com/developerworks/cn/java/j-jsp05273/ <%@ page language="java" pageEncoding="GBK"%> <%@ taglib uri