手写RecyclerView万能适配器

适配器,大家都知道,不多说,直接上代码:

package com.cn.happiness.mvplib.baseadpter;

import android.content.Context;

import android.support.v7.widget.RecyclerView;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.LinearLayout;

import com.cn.happiness.mvplib.R;

import com.cn.happiness.mvplib.baseadpter.listener.OnRecyclerItemClickListener;

import com.cn.happiness.mvplib.baseadpter.listener.RequestLoadMoreListener;

import com.cn.happiness.mvplib.baseadpter.view.FooterView;

import com.cn.happiness.mvplib.baseadpter.view.LoadType;

import com.cn.happiness.mvplib.util.NetworkUtils;

import java.util.ArrayList;

import java.util.List;

/**

* Created by Happiness on 2017/4/17.

*/

public abstract classBaseRecyclerAdapterextendsRecyclerView.Adapter {

protectedContextmContext;

protected intmLayoutResId;

protectedLayoutInflatermLayoutInflater;

protectedListmData;

private booleanmLoadingMoreEnable=false;

private booleanmNextLoadingEnable=false;

private booleanmHeadAndEmptyEnable;// headerView and emptyView

private booleanmFootAndEmptyEnable;// footerView and emptyView

public booleanmEmptyEnable,mErrorEnable;

private booleanmMultiItemTypeEnable;

privateLoadTypemLoadType;

private static final intVIEW_TYPE_HEADER=0x00001111;//header

public static final intVIEW_TYPE_CONTENT=0x00002222;//content

private static final intVIEW_TYPE_FOOTER=0x00003333;//footer

public static final intVIEW_TYPE_EMPTY=0x00004444;//empty

public static final intVIEW_TYPE_LOADING=0x00005555;//loading

private static final intVIEW_TYPE_NOT_NETWORK=0x00006666;//not network

private intmItemHeight;

private intmLastPosition= -1;

private intmViewType= -1;

privateRequestLoadMoreListenermRequestLoadMoreListener;

privateOnRecyclerItemClickListeneronRecyclerItemClickListener;

privateViewmFooterView,mEmptyView,mErrorView,mContentView,mLoadView;

privateLinearLayoutmHeaderView;

publicBaseRecyclerAdapter(Context context,List data, intlayoutResId) {

this.mContext= context;

this.mData= data ==null?newArrayList<>() : data;

if(layoutResId !=0) {

this.mLayoutResId= layoutResId;

}

this.mLayoutInflater= LayoutInflater.from(mContext);

this.mLoadType= LoadType.CUSTOM;

}

publicBaseRecyclerAdapter(Context context,List data) {

this(context,data,0);

}

/**

*@paramposition

*@return

*/

publicTgetItem(intposition) {

returnmData.get(position);

}

@Override

public intgetItemCount() {

//        int loadMoreCount = isLoadMore() ? 1 : 0;

//        int count = mData.size() + getHeaderViewCount() + getFooterViewCount() + loadMoreCount;

//        if (mData.size() == 0 && mEmptyView != null) {

//            if (count == 0 && (!mHeadAndEmptyEnable || !mFootAndEmptyEnable)) {

//                count += getEmptyViewCount();

//            } else if (mHeadAndEmptyEnable || mFootAndEmptyEnable) {

//                count += getEmptyViewCount();

//            }

//            if ((mHeadAndEmptyEnable && getHeaderViewCount() == 1 && count == 1) || count == 0) {

//                mEmptyEnable = true;

//                count += getEmptyViewCount();

//            }

//        }

//        return count;

if(mViewType==VIEW_TYPE_CONTENT) {

returnmData.size();

}else{

return1;

}

}

public voidchangeItemViewType(inttype) {

this.mViewType= type;

this.notifyDataSetChanged();

}

@Override

public intgetItemViewType(intposition) {

if(!NetworkUtils.isNetworkConnected(mContext)) {

returnVIEW_TYPE_NOT_NETWORK;

}

if(mViewType==VIEW_TYPE_LOADING) {

returnVIEW_TYPE_LOADING;

}else if(mViewType==VIEW_TYPE_EMPTY) {

returnVIEW_TYPE_EMPTY;

}

returnVIEW_TYPE_CONTENT;

//        if (mHeaderView != null && position == 0) {

//            return VIEW_TYPE_HEADER;

//        }

//        // emptyView position <=2 (header +  empty + footer)

//        // four situation  {@link #setEmptyView(header+empty+footer , empty  , empty+footer,header+empty)}  position <= 2

//        if (mData.size() == 0 && mEmptyView != null && mEmptyEnable && position <= 2) {

//

//            // three situation  {@link #setEmptyView(header + empty + footer , header + empty , empty+footer)}  position = 1

//            if ((mHeadAndEmptyEnable || mFootAndEmptyEnable) && position == 1) {

//

//                if (mHeaderView == null && mFooterView != null) { //empty+footer

//                    return VIEW_TYPE_FOOTER;

//                } else if (mHeaderView != null && mEmptyView != null) {  //header + empty + footer , header + empty

//                    return VIEW_TYPE_EMPTY;

//                }

//            }

//            //two situation  position = 0

//            else if (position == 0) {

//                if (mHeaderView == null) {

//                    return VIEW_TYPE_EMPTY;

//                } else {

//                    return VIEW_TYPE_HEADER;

//                }

//            } else if (position == 2 && mHeaderView != null && mFooterView != null) {

//                return VIEW_TYPE_FOOTER;

//            } else if (position == 1) {

//                if (mHeaderView != null) {

//                    return VIEW_TYPE_EMPTY;

//                }

//                return VIEW_TYPE_FOOTER;

//            }

//        }

//        //position == mData.size() + getHeaderViewsCount()

//        else if (position == mData.size() + getHeaderViewCount()) {

//            if (mNextLoadingEnable) {

//                return VIEW_TYPE_LOADING;

//            }

//            return VIEW_TYPE_FOOTER;

//        }

//        //type content

//        else if (position - getHeaderViewCount() >= 0) {

//            if (mMultiItemTypeEnable)

//                return getMultiItemViewType(position - getHeaderViewCount());

//            return VIEW_TYPE_CONTENT;

//        }

//        return super.getItemViewType(position - getHeaderViewCount());

}

protected intgetMultiItemViewType(intposition) {

return super.getItemViewType(position);

}

@Override

public voidonBindViewHolder(finalRecyclerView.ViewHolder holder, intposition) {

mViewType= holder.getItemViewType();

switch(mViewType) {

caseVIEW_TYPE_CONTENT:

if(mData.isEmpty()) {

return;

}

convert((BaseViewHolder) holder,mData.get(holder.getLayoutPosition() - getHeaderViewCount()));

break;

}

}

//    @Override

//    public void onAttachedToRecyclerView(RecyclerView recyclerView) {

//        super.onAttachedToRecyclerView(recyclerView);

//        RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();

//        if (manager instanceof GridLayoutManager) {

//            final GridLayoutManager gridManager = ((GridLayoutManager) manager);

//            gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {

//                @Override

//                public int getSpanSize(int position) {

//                    int type = getItemViewType(position);

//                    return (type == VIEW_TYPE_EMPTY || type == VIEW_TYPE_HEADER || type == VIEW_TYPE_FOOTER

//                            || type == VIEW_TYPE_LOADING) ? gridManager.getSpanCount() : 1;

//                }

//            });

//        }

//    }

@Override

publicRecyclerView.ViewHolderonCreateViewHolder(ViewGroup parent, intviewType) {

BaseViewHolder baseViewHolder =null;

switch(viewType) {

caseVIEW_TYPE_HEADER:

baseViewHolder =newBaseViewHolder(mHeaderView);

break;

caseVIEW_TYPE_CONTENT:

baseViewHolder = onBaseViewHolder(parent);

initItemClickListener(baseViewHolder);

break;

caseVIEW_TYPE_FOOTER:

baseViewHolder =newBaseViewHolder(mFooterView);

break;

caseVIEW_TYPE_EMPTY:

mEmptyView=mLayoutInflater.inflate(R.layout.view_empty_material, null);

mEmptyView.setLayoutParams(newViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));

baseViewHolder =newBaseViewHolder(mEmptyView);

break;

caseVIEW_TYPE_LOADING:

mLoadView=mLayoutInflater.inflate(R.layout.view_loading_material, null);

mLoadView.setLayoutParams(newViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));

baseViewHolder =newBaseViewHolder(mLoadView);

//baseViewHolder = addLoadingView(mLoadType);

break;

caseVIEW_TYPE_NOT_NETWORK:

mErrorView=mLayoutInflater.inflate(R.layout.view_net_error_material, null);

mErrorView.setLayoutParams(newViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));

baseViewHolder =newBaseViewHolder(mErrorView);

break;

}

returnbaseViewHolder;

}

/**

*@paramhelper

*@paramitem

*/

protected abstract voidconvert(BaseViewHolder helper,Titem);

/**

*@paramloadType

*@return

*/

publicBaseViewHolderaddLoadingView(LoadType loadType) {

// mLoadView = new FooterView(mContext);

if(mLoadViewinstanceofFooterView) {

((FooterView)mLoadView).setLoadView(loadType);

}

return newBaseViewHolder(mLoadView);

}

/**

*@paramparent

*/

protectedBaseViewHolderonBaseViewHolder(ViewGroup parent) {

returncreateBaseViewHolder(parent,mLayoutResId);

}

/**

*@paramparent

*@paramlayoutResId

*@return

*/

protectedBaseViewHoldercreateBaseViewHolder(ViewGroup parent, intlayoutResId) {

if(mContentView==null) {

return newBaseViewHolder(getItemView(layoutResId,parent));

}

return newBaseViewHolder(mContentView);

}

/**

*@paramlayoutResId

*@paramparent

*@return

*/

protectedViewgetItemView(intlayoutResId,ViewGroup parent) {

View view =mLayoutInflater.inflate(layoutResId,parent, false);

if(mItemHeight!=0) {

view.getLayoutParams().height=mItemHeight;

}

returnview;

}

/**

*@parambaseViewHolder

*/

private voidinitItemClickListener(finalBaseViewHolder baseViewHolder) {

if(onRecyclerItemClickListener!=null) {

baseViewHolder.itemView.setOnClickListener(v ->onRecyclerItemClickListener.onItemClick(v,baseViewHolder.getLayoutPosition() - getHeaderViewCount()));

}

}

/**

* add loadMore interface

*/

public voidaddLoadMore() {

if(isLoadMore() && !mLoadingMoreEnable) {

mLoadingMoreEnable=true;

mRequestLoadMoreListener.onLoadMoreRequested();

}

}

/**

* is loaded more

*/

private booleanisLoadMore() {

returnmNextLoadingEnable&&mRequestLoadMoreListener!=null&&mData.size() >0;

}

/**

*@return

*/

public intgetHeaderViewCount() {

returnmHeaderView==null?0:1;

}

/**

*@return

*/

public intgetFooterViewCount() {

returnmFooterView==null?0:1;

}

/**

*@return

*/

public intgetEmptyViewCount() {

returnmEmptyView==null?0:1;

}

/**

*@paramposition

*@paramitem

*/

public voidadd(intposition,Titem) {

mData.add(position,item);

notifyItemInserted(position);

}

/**

*@paramdatas

*/

public voidaddAll(List datas) {

if(datas !=null) {

mData.addAll(datas);

notifyDataSetChanged();

}

}

/**

*@paramitem

*/

public voidadd(Titem) {

add(mData.size(),item);

}

/**

*@paramemptyView

*/

public voidaddEmptyView(View emptyView) {

addEmptyView(false, false,emptyView);

}

/**

*@paramisHeadAndEmpty

*@paramemptyView

*/

public voidaddEmpty(booleanisHeadAndEmpty,View emptyView) {

addEmptyView(isHeadAndEmpty, false,emptyView);

}

/**

*@paramfooter

*/

public voidaddFooterView(View footer) {

mNextLoadingEnable=false;

this.mFooterView= footer;

this.notifyDataSetChanged();

}

/**

*@paramheader

*/

public voidaddHeaderView(View header) {

if(mHeaderView==null) {

mHeaderView=newLinearLayout(mContext);

mHeaderView.setOrientation(LinearLayout.VERTICAL);

mHeaderView.setLayoutParams(newViewGroup.LayoutParams(

ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT));

}

if(header !=null) {

try{

this.mHeaderView.addView(header);

}catch(RuntimeException e) {

this.mHeaderView.removeAllViews();

this.mHeaderView.addView(header);

}

this.notifyDataSetChanged();

}

}

/**

* add no more data view

*/

public voidaddNoMoreView() {

mNextLoadingEnable=false;

mFooterView=newFooterView(mContext);

((FooterView)mFooterView).setNoMoreView();

this.notifyDataSetChanged();

}

/**

* add a loadingView

*

*@paramloadingView

*/

public voidaddLoadingView(View loadingView) {

this.mLoadView= loadingView;

}

/**

*@paramisHeadAndEmpty

*@paramisFootAndEmpty

*@paramemptyView

*/

public voidaddEmptyView(booleanisHeadAndEmpty, booleanisFootAndEmpty,View emptyView) {

mHeadAndEmptyEnable= isHeadAndEmpty;

mFootAndEmptyEnable= isFootAndEmpty;

mEmptyView= emptyView;

mEmptyEnable=true;

}

/**

*@paramenable

*/

public voidopenLoadingMore(booleanenable) {

this.mNextLoadingEnable= enable;

}

/**

*@parammultiItemTypeEnable

*/

public voidopenMultiItemType(booleanmultiItemTypeEnable) {

this.mMultiItemTypeEnable= multiItemTypeEnable;

}

/**

*@paramdata

*/

public voidsetData(List data) {

this.mData= data;

//        if (mRequestLoadMoreListener != null) {

//            mNextLoadingEnable = true;

//            mFooterView = null;

//        }

//        mLastPosition = -1;

notifyDataSetChanged();

}

/**

*@paramitemHeight

*/

public voidsetItemHeight(intitemHeight) {

this.mItemHeight= itemHeight;

}

/**

*@paramdata

*/

public voidaddData(List data) {

this.mData.addAll(data);

notifyDataSetChanged();

}

/**

*@return

*/

publicListgetData() {

returnmData;

}

/**

*@paramonRecyclerViewItemClickListener

*/

public voidsetOnRecyclerItemClickListener(OnRecyclerItemClickListener onRecyclerViewItemClickListener) {

this.onRecyclerItemClickListener= onRecyclerViewItemClickListener;

}

/**

*@paramrequestLoadMoreListener

*/

public voidsetOnLoadMoreListener(RequestLoadMoreListener requestLoadMoreListener) {

this.mRequestLoadMoreListener= requestLoadMoreListener;

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容