1. 程式人生 > >RecyclerView輕鬆實現懸浮頭部分組列表

RecyclerView輕鬆實現懸浮頭部分組列表

關於RecyclerView的使用,相信大家都不陌生,並且功能的強大早已讓眾多開發者臣服,本篇主要講解聯絡人列表效果的懸浮頭部分組列表的實現,先上效果圖:

一般的思路應該是利用RecyclerView的itemType來區分標題和下面的子資料而採用不同的佈局,再加上RecyclerView的滾動監聽來實現頭部的懸浮標題移動、隱藏、顯示。本篇的主要思路是從ItemDecoration下手,說到這裡我想你應該心中有個眉目了,如果對ItemDecoration還不熟悉的朋友,可以去看我的前兩篇文章:

先上程式碼:

@Override
    public void getItemOffsets
(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); int pos=parent.getChildViewHolder(view).getAdapterPosition(); if(keys.containsKey(pos)){//留出頭部偏移 outRect.set(0,mTitleHeight,0,0); }else
{ outRect.set(0,dividerHeight,0,0); } }

首先就是根據當前view的position判斷需要在上方留出分割線空隙還是標題欄頭部空隙。

然後是onDraw方法繪製具體的分割線和標題欄,看程式碼:

private void drawVertical(Canvas c, RecyclerView parent){
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();
        int
top=0; int bottom=0; for (int i = 0; i < parent.getChildCount(); i++) { View child=parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); if(!keys.containsKey(params.getViewLayoutPosition())){ //畫普通分割線 top=child.getTop()-params.topMargin-dividerHeight; bottom=top+dividerHeight; mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); }else{ //畫頭部 top=child.getTop()-params.topMargin-mTitleHeight; bottom=top+mTitleHeight; c.drawRect(left,top,right,bottom,mBackgroundPaint); float x=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,10,mContext.getResources().getDisplayMetrics()); float y=bottom - (mTitleHeight - mTextHeight) / 2 - mTextBaselineOffset;//計算文字baseLine c.drawText(keys.get(params.getViewLayoutPosition()),x,y,mTextPaint); } } }

其中用到了canvas.drawText方法,這裡需要注意y座標的計算,文字的繪製是根據baseLine來進行的,不懂的朋友可以去網上查閱相關的知識,本文不再重點講解。

最後就是onDrawOver方法的實現,該方法主要用來在RecyclerView最上層繪製,這樣當列表滾動的時候,可以繪製標題欄,這樣就看上去就一直懸浮在頁面頂部,主要難點就是去判斷上下兩組標題欄的碰撞,下面看程式碼:

@Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDrawOver(c, parent, state);
        if(!showFloatingHeaderOnScrolling){
            return;
        }
        int firstVisiblePos=((LinearLayoutManager)parent.getLayoutManager()).findFirstVisibleItemPosition();
        if(firstVisiblePos==RecyclerView.NO_POSITION){
            return;
        }
        String title=getTitle(firstVisiblePos);
        if(TextUtils.isEmpty(title)){
            return;
        }
        boolean flag=false;
        if(getTitle(firstVisiblePos+1)!=null&&!title.equals(getTitle(firstVisiblePos+1))){
            //說明是當前組最後一個元素,但不一定碰撞了
            View child=parent.findViewHolderForAdapterPosition(firstVisiblePos).itemView;
            if(child.getTop()+child.getMeasuredHeight()<mTitleHeight){
                //進一步檢測碰撞
                c.save();//儲存畫布當前的狀態
                flag=true;
                c.translate(0,child.getTop()+child.getMeasuredHeight()-mTitleHeight);//負的代表向上
            }
        }
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();
        int top=parent.getPaddingTop();
        int bottom=top+mTitleHeight;
        c.drawRect(left,top,right,bottom,mBackgroundPaint);
        float x=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,10,mContext.getResources().getDisplayMetrics());
        float y=bottom - (mTitleHeight - mTextHeight) / 2 - mTextBaselineOffset;//計算文字baseLine
        c.drawText(title,x,y,mTextPaint);
        if(flag){
            //還原畫布為初始狀態
            c.restore();
        }
    }

注意第四行,我加了個變數來控制是否需要懸浮頭部的效果,如果不需要則直接返回,只有分組列表的效果。而getTitle方法主要是用來獲取每個item的title,碰撞的檢測主要是根據當前第一個可見元素和下一個元素進行對比,也就是程式碼第16行,如果這兩個元素所在的title不一樣,就說明是屬於不同的分組,標題欄即將進行碰撞了,當然這樣檢測還是不夠的,還需要根據item的高度和標題欄的高度結合item的getTop值來共同判斷,這樣就可以去移動畫布,造成標題欄被下一個擠上去的效果,同時需要在下面還原移動過的畫布。

怎麼樣,整個邏輯和過程就講解完了,實現起來簡單吧,有疑問的朋友可以在下面留言~~~

相關推薦

RecyclerView輕鬆實現懸浮頭部分組列表

關於RecyclerView的使用,相信大家都不陌生,並且功能的強大早已讓眾多開發者臣服,本篇主要講解聯絡人列表效果的懸浮頭部分組列表的實現,先上效果圖: 一般的思路應該是利用RecyclerView的itemType來區分標題和下面的子資料而採用不同

利用ItemDecoration實現懸浮頭部

在我們的日常開發中,RecyclerView已經被使用的越來越廣泛,今天來講一講使用ItemDecoration來實現專案中需要的懸浮頭部的效果。我們使用listView就可以知道,直接從xml檔案中使用 android:divider 這個屬性就可以直接設定listVie中

Android側滑-RecyclerView輕鬆實現高效的側滑選單

一 前言 利用系統類ItemTouchHelper實現簡單高效的RecyclerView側滑選單! 仿qq的側滑,跟隨滑動… 簡單的側滑點選刪除,覆蓋滑動… 二 知識準備 ItemTouchHelper是Android系統提供的一個幫助

Android仿微信通訊錄:懸停頭部分組列表

今日科技快訊 昨日,vivo與NBA在上海舉辦了戰略釋出會,宣佈vivo將成為NBA在中國唯一的手機

Android StickyListHeadersListView頭部懸停 分組列表實現

引用類庫: implementation 'se.emilsjolander:stickylistheaders:2.7.0' item_pay_bill_month_body_list.xml: <?xml version="1.0" encoding="utf-8"?>

使用ItemDecoration為RecyclerView打造帶懸停頭部分組列表

package jiuyuhulian.com.merchantstoreApp.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; impor

RecyclerView實現帶有頭部的頂部懸浮置頂佈局

由於專案需求需要,需要一個帶有頭部的吸頂佈局,在網上搜索了好多實現辦法,都不太理想,最終使用對RecyclerView新增分割線的方式,重寫了RecyclerView的分割線來實現這個懸浮欄。效果比較簡單,但是比較實用,下面主要介紹實現過程。 首先先貼上效果圖

Android 輕鬆實現 RecyclerView 懸浮

SuspensionBar簡介:a RecyclerView suspension bar implementation like InstagramA RecyclerView suspension bar implementation like Instagram

RecyclerView 粘性(懸浮頭部

感謝 【Android】RecyclerView:打造懸浮效果 RecyclerView分組懸浮列表 上圖來自於網路,上圖的列表中有一個懸浮的粘性頭部的效果,現在這種效果的需求比較常見了,像通訊錄,展示城市列表,還有一些諮詢類 App 分類時都會見到這種效果。如果用 ListV

基於RecyclerView分組列表

基於RecyclerView的分組列表 一、實現效果 二、使用方式 1. 建立SectionList例項 2. 新增分組 3. 資料關聯到Adapter 三、設計思路 四、程式碼分析

懸浮佈局的最差實現方式,懸浮頭部實現,viewpager巢狀滑動

給部分程式碼看個大概實現,繼承 linearLayout,自己處理滑動,自己計運算元佈局中第一個佈局為摺疊部分。 其實,用scrollview,將listview以及懸浮部分高度設定為螢幕高度,效果直接,省事,滑動體驗更好。巢狀佈局也沒有滑動衝突 public class Scrollabl

Android RecyclerView優雅實現複雜列表佈局(二)

轉載:https://blog.csdn.net/huang3513/article/details/62046528 前言 學習了(一)中那個RecyclerView的一些基礎知識,如果沒有具體看懂可以再返回看不一樣的RecyclerView優雅實現複雜列表佈局(一),那麼接下來我們就在(

Android RecyclerView優雅實現複雜列表佈局(一)

轉載:https://blog.csdn.net/huang3513/article/details/62044688 前言 在多彩佈局不斷呈現的今天,多佈局混合排布成為一個時尚,今天就結合Holder實現RecyclerView複雜列表佈局。  效果圖如下(三種佈局): 

Java 嵌入 SPL 輕鬆實現資料分組

要在 Java 程式碼中實現類似 SQL 中的 GroupBy 分組聚合運算,是比較繁瑣的,通常先要宣告資料結構(Java 實體類),然後用 Java 集合進行迴圈遍歷,最後根據分組條件新增到某個子集合中。Java 8 有了 Lambda(stream)程式碼簡潔了許多,分組後往往還要跟著聚合操作,仍然需

如何實現類似ios彈性列表RecyclerView?

如圖: 實現步驟: 1.整合: compile 'com.lzy.widget:view-core:0.1.9' 2.在需要實現彈性效果的佈局(RecyclerView,Listview)上加上,同時,改成對應的VerticalRecyclerView,Vertical

jQuery實現QQ分組列表效果

一、實現效果 1.未點選分組標題之前,所有成員都隱藏 2.點選分組標題之後,隱藏的要顯示,已經顯示的要隱藏 3.在點選一個分組標題時,其他已經展開的分組,要隱藏 二、程式碼 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0

Android中使用RecyclerView+RxJava2+Retrofit2+Butterkinfe8.5.1實現簡單的新聞列表顯示

Android中實現簡單的新聞列表 在剛開始寫CSDN的時候,寫過一篇 Android中通過ListView實現簡單的新聞列表 最近看到有很多剛開始學習Android的同學需要原始碼。不好意思的是,那個例子的原始碼已經不在了。 所以這裡重新寫一篇並且附

Android RecyclerView-使用Itemdecoration實現粘性頭部功能,詳細到具體步驟.

一 前言 該文詳細的介紹了RecyclerView.ItemDecoration實現分組粘性頭部的功能,讓我們自己生產程式碼,告別程式碼搬運工的時代.另外文末附有完整Demo的連線.看下效果: 二 知識準備 RecyclerView.ItemDec

RecyclerView.ItemDecoration實現頂部懸浮效果

StickyDecoration 專案地址:Gavin-ZYX/StickyDecoration  更多:作者   提 Bug    標籤:   利用RecyclerView.ItemDecorati

RecyclerView Item 的懸浮效果(吸附效果)的實現

在參考文章中,實現的是如下效果: 實現的基本原理就是在一個 FrameLayout 中,設定一個 RV,然後在設定一個和 ItemView 一樣佈局結構以及樣式的懸浮條,然後懸浮條根據條件動態設定位置。 而該文章中博主也說明了這種效果的實現方