亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

RecyclerView學習(1) 添加頭部和尾部

2019-11-06 09:44:56
字體:
來源:轉載
供稿:網友

轉載請注明出處 http://blog.csdn.net/u011453163/article/details/58586687

RecyclerView 已經不是一個陌生的組件了,但是相對于現在的項目在還是用比較老舊的ListView,雖然功能都能實現,但是畢竟得跟上時代變化嘛。

關于RecyclerView添加 頭部和尾部,網上已經有各種大牛的版本,實現起來也不是很難。但是看一遍不如擼一遍。這里對學習RecyclerView過程中做一些記錄,部分實現也有借鑒大牛們的思路,見笑。

先上個簡單的效果圖。

這里寫圖片描述

RecyclerView不像ListView 一樣 提供了添加頭部和尾部的方法,但是RecyclerView和ListView一樣是支持多類型Item布局的,那么反過來 頭部和尾部 也就只是一些特定類型的布局而已。所以我們可以通過 public int getItemViewType(int position) 算出頭部和尾部的Type 來加載頭部和尾部。

這里通過兩種方式來實現這個效果,思路是一樣的。

自定義一個 ExpandAdapter 繼承 RecyclerView.Adapter

public class ExpandAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { PRivate RecyclerView.Adapter<RecyclerView.ViewHolder> adapter; public ExpandAdapter(RecyclerView.Adapter<RecyclerView.ViewHolder> adapter) { this.adapter = adapter; } @Override public int getItemViewType(int position) { return adapter.getItemViewType(position); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return adapter.onCreateViewHolder(parent, viewType); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { adapter.onBindViewHolder(holder, position); } @Override public int getItemCount() { return adapter.getItemCount(); } }

這里只是簡單的做一個轉換工作,以方便后期使用不需要去改動太多的東西。 1 通過 List 來實現。 接下來開始分析實現思路,首先要注意的是 public int getItemViewType(int position)默認是返回 0 的, 所以在定義頭部和尾部的type是要錯開 0 ,網上大部分大牛的思路都是定義一個比較大的起始值。

1 一個較大的起始值

private static final int TPEY_COUNT_START_TAG =100000;

2 兩個存儲頭部和尾部 view的集合,和添加頭部和尾部對應的方法

List<View> headViews = new ArrayList<>(); List<View> footViews = new ArrayList<>(); public void addHeadView(View v) { if (headViews != null) { v.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); headViews.add(v); } } public void addFootView(View v) { if (footViews != null) { v.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); footViews.add(v); } }

3 在 public int getItemViewType(int position) 計算返回的type

public int getItemViewType(int position) { if (headViews.size() > 0) { if (position < headViews.size()) { return position+ TPEY_COUNT_START_TAG; } } if (footViews.size() > 0) { if (position >= getItemCount() - footViews.size()) { return position+ TPEY_COUNT_START_TAG; } } return adapter.getItemViewType(position); }

因為這里只有一個position參數可以使用,所以在position的基礎上加個一個較大的值,這里是加法之后我們要做減法來算出下標 取出對應的 頭部view和尾部view。

4 從List中取出渲染對應的頭部和尾部。

定義頭部和尾部對應的ViewHolder 便于理解

class HeaderHolder extends RecyclerView.ViewHolder { public HeaderHolder(View itemView) { super(itemView); } } class FootHolder extends RecyclerView.ViewHolder { public FootHolder(View itemView) { super(itemView); } }@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (headViews.size() > 0) { if (viewType- TPEY_COUNT_START_TAG >= 0 && viewType- TPEY_COUNT_START_TAG < headViews.size()) { return new HeaderHolder(headViews.get(viewType- TPEY_COUNT_START_TAG)); } } if (footViews.size() > 0) { Log.d("ExpandAdapter", "viewType:" + viewType); if (viewType- TPEY_COUNT_START_TAG >= getItemCount() - footViews.size() && viewType- TPEY_COUNT_START_TAG < getItemCount()) { return new FootHolder(footViews.get(viewType- TPEY_COUNT_START_TAG -adapter.getItemCount()-headViews.size())); } } return adapter.onCreateViewHolder(parent, viewType); }

這里主要就是做一些判斷 算出下標 來取出 headViews, footViews中對應的view。

5 綁定數據

@Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if(holder instanceof FootHolder ||holder instanceof HeaderHolder){ return; } adapter.onBindViewHolder(holder, position); } @Override public int getItemCount() { return adapter.getItemCount() + headViews.size() + footViews.size(); }

動態添加的頭部和尾部不需要在適配器里渲染數據,所以直接返回不管。Item總數就是頭部和尾部和普通itme的總和,這個沒必要說的。

6.由于RecyclerView 的布局形式不同。GridLayoutManager,StaggeredGridLayoutManager,LinearLayoutManager。為了適配這三者,還需要重寫兩個方法,這個是借鑒網上大牛的。

@Override public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) { adapter.onViewAttachedToWindow(holder); int position = holder.getLayoutPosition(); if ((position >= 0 && position < headViews.size())||(position>=getItemCount()-footViews.size()&&position<getItemCount())) { ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); if (lp != null && lp instanceof StaggeredGridLayoutManager.LayoutParams) { StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; p.setFullSpan(true); } } } @Override public void onAttachedToRecyclerView(final RecyclerView recyclerView) { super.onAttachedToRecyclerView(recyclerView); if (recyclerView.getLayoutManager() instanceof GridLayoutManager) { ((GridLayoutManager) recyclerView.getLayoutManager()).setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { if (position >= 0 && position < headViews.size()) { return ((GridLayoutManager) recyclerView.getLayoutManager()).getSpanCount(); }else if(position>=getItemCount()-footViews.size()&&position<getItemCount()){ return ((GridLayoutManager) recyclerView.getLayoutManager()).getSpanCount(); } else { return 1; } } }); } }

StaggeredGridLayoutManager

這里寫圖片描述

GridLayoutManager

這里寫圖片描述

以上是使用List實現的方式,第二種的思路也是一樣的,通過兩個HashMap來存儲頭部和尾部 ,就不詳細介紹了,主要列出一些區別。

private static final int TPEY_HEADER_STATRT_INDEX =-100000; private static final int TPEY_FOOT_START_INDEX =100000; HashMap<Integer,View> headViewss=new HashMap<>(); HashMap<Integer,View> footViewss=new HashMap<>(); /**添加頭部*/ public void addHeadView(View v) { if(headViewss!=null){ v.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); headViewss.put(TPEY_HEADER_STATRT_INDEX+headViewss.size(),v); } } /**添加頭部*/ public void addFootView(View v) { if(footViewss!=null){ v.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); footViewss.put(TPEY_FOOT_START_INDEX+footViewss.size(),v); } }/**重寫適配器的兩個方法也有區別 這里也可以同set 返回key值*/ @Override public int getItemViewType(int position) { if(headViewss!=null&&position<headViewss.size()){ return position+TPEY_HEADER_STATRT_INDEX; } if(footViewss!=null&&position>=adapter.getItemCount()+headViewss.size()){ return TPEY_FOOT_START_INDEX+(position-adapter.getItemCount()-headViewss.size()); } return adapter.getItemViewType(position); } /**通過Key直接獲取*/ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if(headViewss.containsKey(viewType)){ return new HeaderHolder(headViewss.get(viewType)); } if(footViewss.containsKey(viewType)){ return new FootHolder(footViewss.get(viewType)); } return adapter.onCreateViewHolder(parent, viewType); }/**此方法基本一樣*/ @Override public int getItemCount() { return adapter.getItemCount() + headViewss.size() + footViewss.size(); }

這里因為是使用了ExpandAdapter 來做一個包裝,所以相應的使用一個自定義RecyclerView來實現。以便我們不用做太多的改動。

public class ExpandRecyclerView extends RecyclerView{ ExpandAdapter expandAdapter; public ExpandRecyclerView(Context context) { super(context); } public ExpandRecyclerView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public ExpandRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void setAdapter(Adapter adapter) { expandAdapter =new ExpandAdapter(adapter); super.setAdapter(expandAdapter); } public void addHeadView(View v){ if(expandAdapter !=null){ expandAdapter.addHeadView(v); expandAdapter.notifyDataSetChanged(); } } public void addFootView(View v){ if(expandAdapter !=null){ expandAdapter.addFootView(v); expandAdapter.notifyDataSetChanged(); } }}

使用自定義RecyclerView之后 我們不需要去改動適配器 還是該怎么使用就怎么使用。

到此,RecyclerView的添加頭部和尾部就結束了。有什么不對的地方望指正。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲高清一区二| 国产精品久久久久久久app| 日韩中文字幕网| 久久在线免费观看视频| 国产999视频| 国产精品亚发布| 久久久久中文字幕| 国产精品高潮在线| 亚洲成av人片在线观看香蕉| 精品久久久久久| 国产精品美女久久| 亚洲图中文字幕| 韩日精品中文字幕| 国内成人精品一区| 美日韩精品免费观看视频| 视频在线一区二区| 日韩精品999| 91超碰中文字幕久久精品| 国产精品午夜一区二区欲梦| 精品毛片三在线观看| 欧美日韩国产中字| 亚洲自拍在线观看| 国产日韩欧美91| 欧美成人全部免费| 欧美视频一区二区三区…| 欧美肥臀大乳一区二区免费视频| 欧美一级视频免费在线观看| 日韩精品中文字幕在线观看| 亚洲国产精品va在看黑人| 欧美韩国理论所午夜片917电影| 91久久精品国产91久久| 欧美高跟鞋交xxxxhd| 国产亚洲欧美aaaa| 大桥未久av一区二区三区| 国产精品久久一| 91在线|亚洲| 亚洲成色777777在线观看影院| 在线播放日韩专区| 欧美xxxx综合视频| 亚洲女同精品视频| 久久久亚洲欧洲日产国码aⅴ| 国产婷婷成人久久av免费高清| 亚洲国产精品va在线看黑人动漫| 国产精品久久久久久超碰| 午夜精品www| 亚洲人成电影在线播放| 日韩欧美国产成人| 欧美电影免费观看高清完整| 精品视频偷偷看在线观看| 亚洲精品电影网| 欧美黄色三级网站| 欧美视频13p| 性欧美xxxx交| 日韩女优人人人人射在线视频| 欧美午夜久久久| 亚洲剧情一区二区| 91久久国产精品91久久性色| 久热99视频在线观看| 疯狂欧美牲乱大交777| 亚洲精品乱码久久久久久金桔影视| 精品激情国产视频| 亚洲最新av在线网站| 成人激情视频在线观看| 国产成人一区三区| 亚洲精品国产福利| 欧美成aaa人片免费看| 亚洲精品v天堂中文字幕| 亚洲欧美一区二区精品久久久| 色综合久久88色综合天天看泰| 欧美精品免费看| 久久久精品免费| 久久久久久久97| 最新69国产成人精品视频免费| 亚洲国产精品高清久久久| 精品国产一区二区三区久久久| 国产免费久久av| 欧美激情高清视频| 亚洲精品视频在线观看视频| 久久久久北条麻妃免费看| 色av中文字幕一区| 91国自产精品中文字幕亚洲| 欧美精品国产精品日韩精品| 91在线免费视频| 国产欧美精品一区二区三区-老狼| 日韩av一区二区在线| 狠狠躁18三区二区一区| 日韩av影视在线| 伊人男人综合视频网| 精品视频—区二区三区免费| 国产精品自拍视频| 久久99视频精品| 久久久久久伊人| 欧美精品久久久久久久久| 久久久久久久一区二区三区| 欧美放荡办公室videos4k| 久久精品视频在线| 久久这里有精品视频| 亚洲第一偷拍网| 欧美日韩在线观看视频小说| 国产精品扒开腿爽爽爽视频| 亚洲国产精品推荐| 国产精品视频中文字幕91| 日韩在线观看网站| 欧美大奶子在线| 欧美性生活大片免费观看网址| 欧美精品制服第一页| 国内精品免费午夜毛片| 欧美xxxx做受欧美| 91亚洲精品一区二区| 韩国一区二区电影| 精品久久久久久亚洲精品| 久久五月天综合| 欧美日韩在线视频首页| 精品亚洲va在线va天堂资源站| 欧洲成人性视频| 性欧美亚洲xxxx乳在线观看| 欧美一区二区三区免费视| 尤物精品国产第一福利三区| 91精品久久久久久久久久久久久| 日韩中文视频免费在线观看| 亚洲欧美日韩精品久久亚洲区| 日韩亚洲国产中文字幕| 激情av一区二区| 日韩最新中文字幕电影免费看| 久久精品91久久久久久再现| 日韩不卡中文字幕| 在线视频日韩精品| 亚洲欧美成人在线| 人人澡人人澡人人看欧美| 亚洲免费电影在线观看| 亚洲黄色www| 亚洲一区二区久久久久久| 成人av电影天堂| 亚洲欧美日韩天堂一区二区| 亚洲精品视频播放| 一本色道久久88综合日韩精品| 国产在线精品一区免费香蕉| 欧美午夜www高清视频| 久久久亚洲国产天美传媒修理工| 欧美极品xxxx| 91精品国产九九九久久久亚洲| 国产在线拍偷自揄拍精品| 在线观看91久久久久久| 欧美xxxx做受欧美| 国产欧美在线观看| 欧美又大又硬又粗bbbbb| 国产精品中文字幕久久久| 色综合色综合久久综合频道88| 欧美日韩国产在线| 精品av在线播放| 久久久伊人日本| 疯狂蹂躏欧美一区二区精品| 国产91在线播放| 亚洲午夜性刺激影院| 97国产一区二区精品久久呦| 国产精品视频久久久| 亚洲国产欧美一区| 久久成人精品电影| 亚洲国产一区二区三区四区| 亚洲精品国精品久久99热| 欧美www视频在线观看| 亚洲免费视频网站| 亚洲国产精品久久久| 欧美日韩国产中文字幕|