最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android RecyclerView添加頭部和底部的方法

 更新時間:2016年05月19日 17:22:36   作者:iGoach  
這篇文章主要為大家詳細介紹了Android RecyclerView添加頭部和底部的方法,感興趣的小伙伴們可以參考一下

如果只是想添加頭部,可是使用GitHub里面這個項目,它可以為LinearLayoutManager,GridLayoutManager ,StaggeredGridLayoutManager布局的RecyclerView添加header。使用起來也十分簡單;
只需將RecyclerViewHeader布局放在RecyclerView的上層。

<FrameLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content">

 <android.support.v7.widget.RecyclerView
  android:id="@+id/recycler"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal|top" />

 <com.bartoszlipinski.recyclerviewheader.RecyclerViewHeader
  android:id="@+id/header"
  android:layout_width="match_parent"
  android:layout_height="100dp"
  android:layout_gravity="center_horizontal|top">

  <TextView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_centerInParent="true"
   android:text="header"/>

 </com.bartoszlipinski.recyclerviewheader.RecyclerViewHeader>

</FrameLayout>

然后獲得RecyclerViewHeader對象:

RecyclerViewHeader header = (RecyclerViewHeader) findViewById(R.id.header);

把RecyclerViewHeader賦予RecyclerView

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
// set LayoutManager for your RecyclerView
header.attachTo(recyclerView, true);

注意事項
RecyclerViewHeader必須在RecyclerView設置了LayoutManager之后調(diào)用。

目前該庫適用于LinearLayoutManager,StaggeredGridLayoutManager和GridLayoutManager布局的RecyclerViews。只支持垂直布局LayoutManager。如果你打算在RecyclerView中使用setOnScrollListener(…)方法,確保在setOnScrollListener(…)的attachTo(…)方法之前使用。

當然我們也可以自己寫一個添加頭部和底部的RecyclerView。它實現(xiàn)的基本原理也是通過getItemViewType方法返回不同的類型來添加頭部和底部。
首先我們自定義一個RecyclerView:

public class WrapRecyclerView extends RecyclerView {
 public ArrayList<View> mHeaderViews = new ArrayList<>();
 public ArrayList<View> mFooterViews = new ArrayList<>();
 //添加Adapter
 public Adapter mAdapter;
 public WrapRecyclerView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
 }

 public WrapRecyclerView(Context context, AttributeSet attrs) {
  super(context, attrs);
 }

 public WrapRecyclerView(Context context) {
  super(context);
 }
 public void addHeaderView(View view){
  mHeaderViews.clear();
  mHeaderViews.add(view);
  if(mAdapter!=null){
   if(!(mAdapter instanceof RecyclerWrapAdapter)){
    mAdapter = new RecyclerWrapAdapter(mHeaderViews,mFooterViews,mAdapter);
   }
  }
 }
 public void addFooterView(View view){
  mFooterViews.clear();
  mFooterViews.add(view);
  if(mAdapter!=null){
   if(!(mAdapter instanceof RecyclerWrapAdapter)){
    mAdapter = new RecyclerWrapAdapter(mHeaderViews,mFooterViews,mAdapter);
   }
  }
 }
 public void setAdapter(Adapter adapter){
  if (mHeaderViews.isEmpty()&&mFooterViews.isEmpty()){

   super.setAdapter(adapter);
  }else {
   adapter = new RecyclerWrapAdapter(mHeaderViews,mFooterViews,adapter) ;
   super.setAdapter(adapter);
  }
  mAdapter = adapter ;
 }
}

我們會看到我們有一個RecyclerWrapAdapter沒有實現(xiàn),下面我們就來看下RecyclerWrapAdapter,這個也是實現(xiàn)添加頭部和尾部的關鍵。

public class RecyclerWrapAdapter extends RecyclerView.Adapter implements WrapperAdapter{
 private RecyclerView.Adapter mAdapter;

 private ArrayList<View> mHeaderViews;

 private ArrayList<View> mFootViews;
 static final ArrayList<View> EMPTY_INFO_LIST =
   new ArrayList<View>();
 private int mCurrentPosition;
 public RecyclerWrapAdapter(ArrayList<View> mHeaderViews, ArrayList<View> mFootViews, RecyclerView.Adapter mAdapter){
  this.mAdapter = mAdapter;
  if (mHeaderViews == null) {
   this.mHeaderViews = EMPTY_INFO_LIST;
  } else {
   this.mHeaderViews = mHeaderViews;
  }
  if (mFootViews == null) {
   this.mFootViews = EMPTY_INFO_LIST;
  } else {
   this.mFootViews = mFootViews;
  }
 }

 public int getHeadersCount() {
  return mHeaderViews.size();
 }

 public int getFootersCount() {
  return mFootViews.size();
 }
 @Override
 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  if (viewType == RecyclerView.INVALID_TYPE) {
   return new HeaderViewHolder(mHeaderViews.get(0));
  } else if (viewType == RecyclerView.INVALID_TYPE - 1) {
   return new HeaderViewHolder(mFootViews.get(0));
  }
  return mAdapter.onCreateViewHolder(parent, viewType);
 }

 @Override
 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  //如果頭部不為空,那么我們就要先添加頭部,所以我們只要
  //把前面幾個position給頭部,當position小于頭部總數(shù)的時候,
  //我們返回頭部view。再判斷原Adapter 的 count 與當前 position 
  // 的差值來比較,是調(diào)用原 Adapter 的 getView 方法,還是獲取 footView
  // 的 view。
  int numHeaders = getHeadersCount();
  if (position < numHeaders) {
   return;
  }
  int adjPosition = position - numHeaders;
  int adapterCount = 0;
  if (mAdapter != null) {
   adapterCount = mAdapter.getItemCount();
   if (adjPosition < adapterCount) {
    mAdapter.onBindViewHolder(holder, adjPosition);
    return;
   }
  }
 }

 @Override
 public int getItemCount() {
  if (mAdapter != null) {
   return getHeadersCount() + getFootersCount() + mAdapter.getItemCount();
  } else {
   return getHeadersCount() + getFootersCount();
  }
 }

 @Override
 public RecyclerView.Adapter getWrappedAdapter() {
  return mAdapter;
 }
 @Override
 public int getItemViewType(int position) {
  //增加兩個類型
  //RecyclerView.INVALID_TYPE 添加頭部
  //RecyclerView.INVALID_TYPE-1 添加尾部
  //如果頭部不為空,那么我們就要先添加頭部,所以我們只要
  //把前面幾個position給頭部,當position小于頭部總數(shù)的時候,
  //我們返回頭部類型。再判斷原Adapter 的 count 與當前 position 
  // 的差值來比較,是調(diào)用原 Adapter 的 類型,還是獲取 footView
  // 的類型。
  mCurrentPosition = position ;
  int numHeaders = getHeadersCount();
  if(position<numHeaders){
   return RecyclerView.INVALID_TYPE ;
  }
  int adjPosition = position - numHeaders ;
  int adapterCount = 0 ;
  if(mAdapter!=null){
   adapterCount = mAdapter.getItemCount() ;
   if(adjPosition < adapterCount){
    return mAdapter.getItemViewType(adjPosition);
   }
  }
  return RecyclerView.INVALID_TYPE - 1;
 }
 private static class HeaderViewHolder extends RecyclerView.ViewHolder {
  public HeaderViewHolder(View itemView) {
   super(itemView);
  }
 }
}

我們還可以實現(xiàn)一個接口,來調(diào)用RecyclerWrapAdapter對象:

public interface WrapperAdapter {

 public RecyclerView.Adapter getWrappedAdapter() ;
}

這樣我們就可以把RecyclerView布局改成WrapRecyclerView就可以了,然后調(diào)用addHeaderView或者addFooterView就可以添加頭部和尾部了。

以上就是本文的全部內(nèi)容,希望對大家學習Android 軟件編程有所幫助。

相關文章

  • Android 7.0應用之間如何共享文件

    Android 7.0應用之間如何共享文件

    這篇文章主要介紹了Android 7.0應用之間如何共享文件,幫助大家更好的理解和使用Android進行開發(fā),感興趣的朋友可以了解下
    2020-12-12
  • 手把手教學Android用jsoup解析html實例

    手把手教學Android用jsoup解析html實例

    本篇文章主要介紹了手把手教學Android用jsoup解析html實例,jsoup 是一款Java 的HTML解析器。具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Kotlin Thread線程與UI更新詳解

    Kotlin Thread線程與UI更新詳解

    本篇主要介紹Kotlin中Thread線程與UI更新,注意不是協(xié)程而是線程。Kotlin本身是支持線程的。同時協(xié)程也是運行在線程中的
    2022-12-12
  • Android應用開發(fā)的版本更新檢測升級功能實現(xiàn)示例

    Android應用開發(fā)的版本更新檢測升級功能實現(xiàn)示例

    本文對Android版本更新的知識做全面的總結(jié),主要包括開發(fā)中版本的設置,如何檢測本程序的版本,版本的更新判斷和顯示,新版本程序的安裝
    2022-04-04
  • Android?利用OpenCV制作人臉檢測APP

    Android?利用OpenCV制作人臉檢測APP

    本篇文章手把手教大家使用OpenCV來實現(xiàn)一個能在安卓手機上運行的人臉檢測APP。其實不僅僅是能檢測人臉,還能檢測鼻子,嘴巴,眼睛和耳朵。需要的朋友可以參考一下
    2021-12-12
  • Android消息通知Notification常用方法(發(fā)送消息和接收消息)

    Android消息通知Notification常用方法(發(fā)送消息和接收消息)

    最近在做消息通知類Notification的相關業(yè)務,利用閑暇時間總結(jié)一下,主要分為兩部分來記錄:發(fā)送消息和接收消息,對Android消息通知相關知識感興趣的朋友一起看看吧
    2024-02-02
  • Android動畫之3D翻轉(zhuǎn)效果實現(xiàn)函數(shù)分析

    Android動畫之3D翻轉(zhuǎn)效果實現(xiàn)函數(shù)分析

    Android中的翻轉(zhuǎn)動畫效果的實現(xiàn),Android中并沒有提供直接做3D翻轉(zhuǎn)的動畫,所以關于3D翻轉(zhuǎn)的動畫效果需要我們自己實現(xiàn),那么我們首先來分析一下Animation 和 Transformation,感興趣的朋友可以了解下啊
    2013-01-01
  • Android如何通過手機自動獲取短信驗證碼

    Android如何通過手機自動獲取短信驗證碼

    注冊帳號時,經(jīng)常需要手機獲取驗證碼,Android如何通過手機自動獲取短信驗證碼,下面看看小編給大家分享的一段代碼,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Android Studio導入第三方類庫的方法

    Android Studio導入第三方類庫的方法

    這篇文章主要介紹了Android Studio導入第三方類庫的方法,導入*.jar包、導入第三方java類庫含源碼包以及aar的引入,需要的朋友可以參考下
    2016-07-07
  • 淺談Android中線程池的管理

    淺談Android中線程池的管理

    本篇文章主要介紹了淺談Android中線程池的管理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01

最新評論

新兴县| 和硕县| 宿松县| 江达县| 伽师县| 洛南县| 尼木县| 清苑县| 宜丰县| 花垣县| 房山区| 大冶市| 区。| 枣阳市| 靖宇县| 普安县| 青州市| 达尔| 宣城市| 凯里市| 固阳县| 久治县| 上蔡县| 措勤县| 原阳县| 崇阳县| 莲花县| 卫辉市| 恩施市| 鹤壁市| 苗栗县| 锡林浩特市| 蒲江县| 通城县| 扎囊县| 长顺县| 侯马市| 丹阳市| 沾益县| 革吉县| 龙南县|