打造一个强大的万能RecyclerView Adapter

打造一个强大的万能RecyclerView Adapter

2018.2.3更新

//精简包名,增加易用性的最新版


3YDT3SQ9EZKC48%II_RVSG6.png

使用

默认根据itemholder的泛型确定相应position的类型


0X~MX4_7I~$RQ{}OM1YAJYQ.png

状态布局的封装

adapter实现了该接口,用于状态切换


3.png

更多功能

itemholder 重写相应方法可达到gridlayoutManager staggled设置列宽

  public abstract class ItemHolder<T> {
    private int layout;
    /**
     * StaggeredLayoutManager重写此方法
     *
     * @return 是否占据一个
     */
    public boolean isfull() {
        return false;
    }

    /**
     * GrideLayoutManager重写此方法
     *
     * @param position
     * @return 占的个数
     */
    public int gridSpanSize(T item, int position) {
        return 1;
    }

    /**
     * onBind时调用
     *
     * @param holder
     * @param item
     * @param position
     */
    public abstract void onBind(Holder holder, T item, int position);

    /**
     * 是否是这种Type的view
     *
     * @param item
     * @param position
     * @return
     */
    public boolean istype(Object item, int position){
        return true;
    }

    public int getLayout() {
        return layout;
    }

    public ItemHolder<T> setLayout(int layout) {
        this.layout = layout;
        return this;
    }
}



---






---
## [github 地址](https://github.com/While1true/SuperAdapter)
## [示例apk 地址](https://github.com/While1true/SuperAdapter/blob/master/app-debug.apk)
### 做了些什么?
1. 封装了错误布局,空布局,底部更多布局
2. 支持多类型布局 ,addtype添加不同类型布局
3. 支持GridLayoutManage 设置单个spancount
4. 支持StaggledLayoutManager 设置单个类型item、全屏
5. 支付扩展状态布局类型,调用等

---
### 1.效果

![2017-09-10-15-46-16.gif](http://upload-images.jianshu.io/upload_images/6456519-6ca0f77cb7dceb4d.gif?imageMogr2/auto-orient/strip)
### 2.使用
### -  简单使用

切换状态调用adapter如下方法
/*params showstate  SHOW_EMPTY、SHOW_LOADING 、SHOW_ERROR、SHOW_NOMORE、TYPE_ITEM
*@ params E 传递给相应布局数据
*/
void showState(int showstate, E e);

//不需要传递改变就调用如下
void showEmpty();

void ShowError();

void showItem();

void showLoading();

void showNomore();

  

单item类型
final SRecyclerView recyclerView = (SRecyclerView) findViewById(R.id.sre);
adapter = new SBaseAdapter<String>(list,R.layout.test3) {
@Override
protected void onBindView(SimpleViewHolder holder, String item, int position) {
holder.setText(R.id.tv, item + "--1");
holder.setBackgroundColor(R.id.tv, 0xff226666);
}
}


多item类型 addType
new SBaseMutilAdapter(list)

            .addType(R.layout.test1, new SBaseMutilAdapter.ITEMHOLDER<String>() {
                @Override
                public void onBind(SimpleViewHolder holder, String item, int position) {
                    holder.setText(R.id.tv, item + "类0 ");
                    holder.setBackgroundColor(R.id.tv, 0xff666666);
                }
                 @Override
                public boolean istype(String item, int position) {
                    return item.type==1;
                }
            })
             .addType(R.layout.test1, new SBaseMutilAdapter.ITEMHOLDER<String>() {
                @Override
                public void onBind(SimpleViewHolder holder, String item, 
                 .....
             })


- 设置状态布局相应按钮的监听
.setStateListener(new DefaultStateListener() {
                @Override
                public void netError(Context context) {
                    adapter.showState(SBaseAdapter.SHOW_LOADING, "ggg");
                    Toast.makeText(context, "ddd", Toast.LENGTH_LONG).show();
                }

                @Override
                public void showEmpty(Context context) {
                    super.showEmpty(context);
                    Toast.makeText(context, "ddad", Toast.LENGTH_LONG).show();
                }
            });
- 设置GridLayoutManager staggedlayoutManager item占的空间

             //如果是GridelayoutManager 重写ITEMHOLDER此方法返回item占据大小
                @Override
                protected int gridSpanSize(String item, int position) {
                    return 2;
                }
                //如果是staggedlayoutManager 重写ITEMHOLDER此方法返回
               //是该类型布局就return true
                @Override
                protected boolean isfull() {
                    return super.isfull();
                }
### - 自定义使用
-    在application中配置全局的资源id

BaseAdapterRecord.init(new Recorder.Builder()
.setEmptyRes()
.setNomoreRes()
.setLoadingRes()
.setErrorRes()
.setStateHandlerClazz(DefaultStateHandler.class)
.build());

- 自定义状态布局处理handler

实现StateHandlerInterface接口
可以仿照默认的DefaultStateHandler来编写

/**
 * 用于传递相应的监听 在Adapter设置监听
 * @param listener 继承BaseStateListener 定义自己想要的监听方法
 * @return
 */
StateHandlerInterface setStateClickListener(BaseStateListener listener);
BaseStateListener getStateClickListener();

/**
 * BindView时调用
 * @param holder
 * @param t 由Adapter showState(int showstate, E e);传递过来的数据
 *          默认定义为String,如果你有不同需求,可改为任意类型
 */
void BindEmptyHolder(SimpleViewHolder holder,T t);
void BindErrorHolder(SimpleViewHolder holder,T t);
void BindLoadingHolder(SimpleViewHolder holder,T t);
void BindNomoreHolder(SimpleViewHolder holder,T t);

/**
 * detachFromWindow时调用 销毁一些持有的引用
 */
void destory();

/**
 * 切换状态时调用,可以用来关闭一些之前状态的动画
 */
void switchState();
- 代码中也可局部改变单一的状态布局id 和相应handler

### 实现方式
- 拦截Adapter的getItemCount() getItemViewType()来实现状态布局
- 多类型布局是托管给静态内部类ITEMHOLDER,通过添加不同ITEMHOLDER实例达到不同item类型


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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • View 自定义View中在onDraw()方法中可以设置padding吗?答案是不能,设置padding后,Vi...
    ElvenShi阅读 1,736评论 0 0
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,617评论 4 59
  • 很有意思的话:“里约奥运会中国女排打了8场,赢了5场,输了3场,冠军!塞尔维亚打了8场,赢了6场,输了2场,亚军!...
    夕柏玟阅读 320评论 7 13
  • 读李笑来的文章有感 李笑来老师的文章,能够把一个道理讲的很清楚,在自己的认知里面,可以重新定义耳熟能详却又被大众时...
    G先生_海林阅读 179评论 0 0