1. 程式人生 > >Recycleview實現複雜頁面 三種以上佈局 瀑布流 多佈局 scrollview巢狀recyclerView 顯示不全 滑動衝突 之進階終極篇 (轉載)

Recycleview實現複雜頁面 三種以上佈局 瀑布流 多佈局 scrollview巢狀recyclerView 顯示不全 滑動衝突 之進階終極篇 (轉載)

===============================================================================================

 相信很多安卓開發的朋友,尤其是剛從事安卓開發的朋友, 當產品經理遞過來一張複雜頁面的設計圖時 , 都會有一種茫然的感覺 , 在心裡想著如何實現 , 然後網上搜索如何實現複雜佈局頁面,當初我也是這麼過來的, 可以說踩了很多很大的坑 ,  所以決定寫下這篇部落格 ,  供各位猿猿參觀 , 想相信看完此篇 , 絕對是最後一篇 ,  不用再找了 , 當然 此篇為進階篇 。 如果你對recycleview 還不熟悉 

, 建議先了解recycleview , 熟悉其基本使用。如果有問題 , 歡迎加QQ群 661614986。

言歸正傳, 先來看一下效果圖:


 gif錄出來 有點怪 , 所以就截圖了,原始碼已放入github

下面我來分析一下這種複雜介面的具體實現思路, 當然這裡非常感謝 奮鬥  liaoinstan 大神的文章 http://blog.csdn.net/liaoinstan/article/details/52671101,朋友可以看一下 , 最初我也是看了此篇 , 但是此篇並非完美, 在此我進一步總結一下 。

首先我們來做一個分水嶺, 就是佈局中上拉載入的佈局是否是瀑布流,

1、如果不是瀑布流, 那就很簡單了,借鑑一下

liaoinstan的圖片,


如果實現此圖, liaoinstan給瞭如下兩種方案,

第一種:

 這裡recycleview5 應該還是列表管理器, 懶得畫圖了,意思一樣 。

這種方案構思就是recycleview裡面巢狀多recycleview,構思簡單,編寫也是行如流水,能夠實現需求,但是問題來了,以下是重點,這種多巢狀的寫法,在上拉載入的時候,拉到後面基本就會很卡,就算釋放glide(或者其他圖片載入框架)的記憶體也是釋放不掉,直至oom或者卡死不動,所以這種巢狀思路只適合沒有載入更多的的情況。

第二種:


這中思路里面最重要的方法就是

  1. @Override
  2. publicvoid onAttachedToRecyclerView(
    final RecyclerView recyclerView) {  
  3.     super.onAttachedToRecyclerView(recyclerView);  
  4.     RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();  
  5.     if(manager instanceof GridLayoutManager) {  
  6.         final GridLayoutManager gridManager = ((GridLayoutManager) manager);  
  7.         gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {  
  8.             @Override
  9.             publicint getSpanSize(int position) {  
  10.                 int type = getItemViewType(position);  
  11.                 switch (type){  
  12.                     case TYPE_SLIDER:  
  13.                     case TYPE_TYPE2_HEAD:  
  14.                     case TYPE_TYPE3_HEAD:  
  15.                         return6;  
  16.                     case TYPE_TYPE2:  
  17.                         return3;  
  18.                     case TYPE_TYPE3:  
  19.                         return2;  
  20.                     default:  
  21.                         return3;  
  22.                 }  
  23.             }  
  24.         });  
  25.     }  
  26. }  
liaoinstan大神已經給了具體程式碼和思路,完美實現功能,非常感謝。

2.如果需求是帶瀑布流的

那麼,第一種情況裡面的 onAttachedToRecyclerView方法瀑布流管理器裡面就不存在,因此無法使用,只能另尋他法,liaoinstan大神推薦TwowayView能實現上圖這種效果但是, 呵呵,不好意思,當你用TwowayView寫實際應用時, 需要網路載入時, 問題出現了,那就是你來回下拉重新整理幾次,佈局上面就會有一塊白的空白區域, 直至最後你的佈局完全看不見, 只剩下一片白 ,我沒有解決此問題。當時我寫我們公司的應用時, 寫到這裡的時候,我就一臉懵逼了, 然後就用最最古老的辦法,直接scrollview裡面巢狀幾個recycleview,寫到最後還是意料之中出現問題了,上拉載入到最後還是會卡頓,而且在6.0以上 高度總是有問題。
到這裡,大哭大哭大哭我差點想和產品說我們不用瀑布流好不好,但我又從新搜了一下,在瀑布流管理器裡面有LayoutParams.setFullSpan(true);方法,在 

  1. onCreateViewHolder(ViewGroup parent, int viewType)  

 總體思路就是,把下面的瀑布流部分作為一種type,其他無需載入更多的佈局放在recycleview裡面

使用此方法使這一行佔滿全屏,這是我到現在總結出來的最好實現方式。

思路圖如下:


 部分程式碼如下

  1. @Override
  2.     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {  
  3.         if (viewType == TYPE_TOP) {  
  4.                //頭部輪播圖
  5.             View viewtop = inflater.inflate(R.layout.adapter_slider, parent, false);  
  6.             StaggeredGridLayoutManager.LayoutParams params =  
  7.                     (StaggeredGridLayoutManager.LayoutParams) viewtop.getLayoutParams();  
  8.             params.setFullSpan(true);//最為重要的一個方法,佔滿全屏,以下同理
  9.             viewtop.setLayoutParams(params);  
  10.             returnnew TypeTopsliderHolder(viewtop);  
  11.         } elseif (viewType == TYPE_HEADER) {  
  12.             View view2 = inflater.inflate(R.layout.item_homepagertypeheader_type, parent, false);  
  13.             StaggeredGridLayoutManager.LayoutParams params =  
  14.                     (StaggeredGridLayoutManager.LayoutParams) view2.getLayoutParams();  
  15.             params.setFullSpan(true);  
  16.             view2.setLayoutParams(params);  
  17.             returnnew TypeheadHolder(view2);  
  18.         } elseif (viewType == TYPE_CENTER) {  
  19.             //中間head下面的佈局
  20.             View view = inflater.inflate(R.layout.itam_homepageradapter_rv2, parent, false);  
  21.             StaggeredGridLayoutManager.LayoutParams params2 =  
  22.                     (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();  
  23.             params2.setFullSpan(true);  
  24.             view.setLayoutParams(params2);  
  25.             returnnew TypetypeHolder2(view);  
  26.         } elseif (viewType == TYPE_CATEGORY) {  
  27. //四個快速入口的holder
  28. //這裡的TypetypeHolder和上面的TypetypeHolder2 其實可以寫成一個holder,這裡為了簡單,避免引起復用帶來的問題,分開了
  29.             View view = inflater.inflate(R.layout.itam_homepageradapter_rv2, parent, false);  
  30.             StaggeredGridLayoutManager.LayoutParams params2 =  
  31.                     (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();  
  32.             params2.setFullSpan(true);  
  33.             view.setLayoutParams(params2);  
  34.             returnnew TypetypeHolder(view);  
  35.         } elseif (viewType == TYPE_REFRESH) {  
  36.             returnnew TypeRefresh(inflater.inflate(R.layout.item_raiders2, parent, false));  
  37.         } else {  
  38.             View viewtop = inflater.inflate(R.layout.adapter_slider, parent, false);  
  39.             StaggeredGridLayoutManager.LayoutParams params =  
  40.                     (StaggeredGridLayoutManager.LayoutParams) viewtop.getLayoutParams();  
  41.             params.setFullSpan(true);  
  42.             viewtop.setLayoutParams(params);  
  43.             returnnew TypeTopsliderHolder(viewtop);  
  44.         }  
  45.     }  


這個方法 在大神的文章裡 只是 副作用的 提了一下, 光想著TwowayView 了 所以沒在意 ,最後還是此方法解決了這種需求。

我的線上專案為[空藝術,朋友可以點選下載看一下效果](http://a.app.qq.com/o/simple.jsp?pkgname=com.happyo2o.artexhibition),首頁就是這個原理實現的,大家可以看一下效果。

總結:本人只是理論性的總結了複雜佈局的實現方式,以及一些坑 , 避免各位浪費時間和精力 ,鄙人在此獻醜了,程式碼已經全部上傳,github專案原始碼 歡迎star , 轉載  , 萬分感謝 。


相關推薦

Recycleview實現複雜頁面 以上佈局 瀑布 佈局 scrollviewrecyclerView 顯示 滑動衝突 終極 轉載

=============================================================================================== 相信很多安卓開發的朋友,尤其是剛從事安卓開發的朋友, 當產品經理遞過來一張複雜頁面的

工作小記~~~使用LinearLayout實現仿ListView解決ListView顯示

使用LinearLayout實現仿ListView(解決巢狀ListView顯示不全) 滑動控制元件巢狀ListView時就會出現ListView中的資料顯示不全的現象,這時我們就會想到巢狀NoScrollListView去實現。功能是可以實現但是在列表中

Android 混排效果 ScrollView RecyclerView gridview 實現listview gridview 效果

RecyclerView 出現以後 很受大家歡迎 漂亮流暢的列表 簡單的操作 可以幫我們完成很多的列表 但是有一種listview 巢狀gridview 的效果 目前還是需要巢狀才能完成 現在就簡單說一下我的思路 本人的需求是例如手機淘寶頁 本人使用老套的實現模

ScrollViewRecyclerViewRecyclerView總是把它上面的控制元件頂出頁面(頁面出現自己滾動)

ScrollView巢狀RecyclerView,當我離開當前頁面,然後又回來時,RecyclerView就會把它上邊的控制元件都擠出頁面,它顯示在頁面最上邊。 原因應該是RecyclerView搶了焦點,只需要把ScrollView中最上邊的那個控制元件加上幾句程式碼

ScrollViewRecyclerViewScrollViewListview、ScrollView各種佈局,預設在頂部和回到頂部的解決方法;

如果:ScrollView.scrollTo(0,0);ScrollView.fullScroll(View.FOCUS_UP) ;ScrollView.smoothScrollTo(0, 0);這三種方法都解決不了你的問題,那麼請往下看;佈局有點複雜:最外層是SwipeRe

解決6.0以上ScrollViewRecyclerView能同時滑動的問題。

在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