使用vlayout輕松構建復雜布局頁面&上拉加載

設計

拿到了新項目的設計圖,如圖所示:


樂烹APP-首頁.png

構建這個頁面,如果沒有滑動到底部加載更多功能,可以考慮用scollerview中一點點畫布局。如果需要加載
更多的話,就必須要考慮列表項的回收與復用的問題,scollerview顯然不能滿足,這時候我們就需要recyclerview來實現。傳統的recyclerview實現復雜布局還是比較麻煩的,需要計算每個item的position,還要構建合適的數據源等等誰用誰知道。
而阿里基于recyclerview 打造的vlayout完美的解決了我們的麻煩,幫助我們傻瓜式構建多條目的復雜布局頁面,同時還減少了布局層次,提高了性能和滑動的流暢度。

分析

關于vlayout的使用,大家可以直接參看官方的demo,還有這篇使用攻略,應該就可以掌握了。下面僅就這個設計圖實戰分析一下:

上.png
下.png

區域1:搜索欄 ,固定在頁面上方,不隨頁面滾動,使用StickyLayoutHelper構建。
區域2,區域7: 網格布局 ,使用GridLayoutHelper構建。
區域3, 區域6,區域8 :標題欄,使用SingleLayoutHelper 構建,并且由于布局一致,相同的布局邏輯可以提出來放在一個adapter中,只需向adapter里提供具體文字及圖片。
區域4, 區域5,區域9 :同樣也是SingleLayoutHelper 構建;區域9內嵌套了一個橫向的recyclerview 用于橫向滾動
區域11:線性列表 ,使用LinearLayoutHelper即可。

上拉加載

vlayout并未提供上拉加載功能。看到GitHub也有人提到這個問題。其實實現方式很簡單:首先在最底部使用通過SingleLayoutHelper 構建一個footer布局,然后recyclerview的addOnScrollListener方法監聽滾動事件,判斷滾動到底部,如果有更多數據,更新列表的適配器加載更多數據。如果沒有更多數據,則更新footer的適配器,顯示無更多數據。代碼如下:

RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {

            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            }

            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                if(hasmore) {
                    VirtualLayoutManager lm = (VirtualLayoutManager)recyclerView.getLayoutManager();
                    int last=0, total=0;
                    last = lm.findLastVisibleItemPosition();
                    total = recyclerView.getAdapter().getItemCount();
                    if(last > 0 && last >= total  -1) {
                        hasmore=false;
                     //模擬加載數據
                        handler.postDelayed(new Runnable() {
                            @Override
                            public void run() {
                                if(page<2) {
                                    for (int i = 0; i < 10; i++) {
                                        list.add("123");
                                    }
                                    adapter_linear.notifyDataSetChanged(); //更新列表適配器
                                    page++;
                                    hasmore = true;
                                }else{
                                    hasmore = false;
                                    adapter_footer.notifyDataSetChanged(); //更新footer適配器
                                }
                            }
                        },2000);

                    }
                }
            }
        };
        recyclerView.addOnScrollListener(onScrollListener);

實現效果

gif有卡頓,實際效果流暢。


ezgif.com-resize.gif

完整demo代碼

https://github.com/yanyiqun001/vlayoutdemo

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,814評論 25 708
  • 內容抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進度條TabLayout圖標下拉刷新...
    皇小弟閱讀 46,870評論 22 665
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,786評論 1 92
  • 你們經歷了高三,但是它對于你們來說并不是黑色的,只是一種比平時緊張的感覺而已,在內心深處你們還沒有真正意義上體會到...
    16aa5fab5f62閱讀 192評論 0 1
  • 最近愛上一首歌《夢回唐朝》。 是在"中國好聲音"是聽到一個滿族的漢子唱的。 他的演繹堪稱一流,那歌詞更是深深打動了...
    甜甜的蜂蜜閱讀 352評論 0 1