CommonAdapter简易Adapter

[复制链接]
来自: MrlLee 分类: Android精品源码 上传时间: 2016-3-29 11:38:36

项目介绍:

CommonAdapter
添加依赖
1.在项目外层的build.gradle中添加JitPack仓库
[XML] 查看源文件 复制代码
repositories {
    maven {
        url "https://jitpack.io"
    }
}
2.在用到的项目中添加依赖
compile 'com.github.tianzhijiexian:CommonAdapter:Latest release'
已解决的问题
  • 提升item的独立性,完美支持item被多处复用
  • item会根据type来做自动复用
  • 支持多种类型的item
  • 一个item仅会调用一次setViews(),避免重复建立监听器
  • 一个item仅会触发一次绑定视图的操作,提示效率
  • ​支持dataBinding和其他第三方注入框架
  • 提供了getView()方法来简化findViewById
  • 支持通过item的构造方法来传入Activity对象
  • 支持通过item的构造方法来传入item中事件的回调
  • 提供了getConvertedData(data, type)方法来对item传入的数据做转换,方便拆包和提升item的复用性
  • 支持viewpager的正常加载模式和懒加载
  • 支持快速将listview的适配器切换为recyclerView的适配器
  • viewpager的notifyDataSetChanged可以正常更新界面
  • 支持recyclerView的添加头部和底部
  • 支持适配器的数据自动绑定,只用操作数据便可,adapter会自动notify界面
示例
demo.gif

零、重要接口
adapter的item必须实现此接口,接口源码如下:
[Java] 查看源文件 复制代码
public interface AdapterItem {

    /**
     * @return item布局文件的layoutId
     */
    @LayoutRes
    int getLayoutResId();

    /**
     * 初始化views
     */
    void bindViews(final View root);

    /**
     * 设置view的参数
     */
    void setViews();

    /**
     * 根据数据来设置item的内部views
     *
     * @param model    数据list内部的model
     * @param position 当前adapter调用item的位置
     */
    void handleData(T model, int position);

}  

例子:
[Java] 查看源文件 复制代码
public class TextItem implements AdapterItem {

    @Override
    public int getLayoutResId() {
        return R.layout.demo_item_text;
    }

    TextView textView;

    @Override
    public void bindViews(View root) {
        textView = (TextView) root.findViewById(R.id.textView);
    }

    @Override
    public void setViews() { }

    @Override
    public void handleData(DemoModel model, int position) {
        textView.setText(model.content);
    }
}

一、ListView+GridView的通用适配器——CommonAdapter
只需继承CommonAdapter便可实现适配器:
[Java] 查看源文件 复制代码
listView.setAdapter(new CommonAdapter(data, 1) {
    public AdapterItem createItem(Object type) {
        return new TextItem();
    }
});

二、RecyclerView的通用适配器——CommonRcvAdapter
通过继承CommonRcvAdapter来实现适配器:
[Java] 查看源文件 复制代码
mAdapter = new CommonRcvAdapter(data) {
 public AdapterItem createItem(Object type) {
        return new TextItem();
  }
};    

三、ViewPager的通用适配器——CommonPagerAdapter
通过继承CommonPagerAdapter来实现适配器:
[Java] 查看源文件 复制代码
viewPager.setAdapter(new CommonPagerAdapter() {
    public AdapterItem createItem(Object type) {
        return new TextItem();
    }
});

设计思路
1. Adapter
如果用adapter常规写法,你会发现代码量很大,可读性低。如果adapter中有多个类型的Item,我们还得在getView()中写很多if-else语句,很乱。 而现在我让adapter的代码量减少到一个8行的内部类,如果你需要更换item只需要动一行代码,真正实现了可插拔化。最关键的是item现在作为了一个独立的对象,可以方便的进行复用。
2. AdapterItem
和原来方式最为不同的一点就是我把adapter的item作为了一个实体,这种方式借鉴了RecyclerView中ViewHolder的设计。把item作为实体的好处有很多,比如复用啊,封装啊,其余的就不细说了。
3. 分层
在使用过程中,我发现如果adapter放在view层,那就会影响到view层的独立性。此外adapter中经常有很多数据处理的操作,比如通过type选择item,数据的拆包、转换等操作。于是我还是推荐把adapter放在mvp的p层,或者是mvvm的m层。通过在实际的项目中使用来看,放在m或p层的效果较好,view的复用也比较好做


相关源码推荐:

我来说两句
所有评论(4)
ThyWhy 2016-10-13 18:12:48
虽不明,但觉厉!
回复
apkbus热心网友 2017-5-13 11:01:59
虽不明,但觉厉!
回复
apkbus热心网友 2017-9-11 15:54:21
很给力,安卓巴士有你更精彩!
回复
恋丶7 2018-12-25 16:28:33
正需要啊,感谢楼主无私分享!
回复
提取码:  下载次数:1 状态:已购或VIP 售价:10(原价:10)金钱 下载权限:初级码农 
2403 2 1
代码贡献英雄榜
用户名 下载数
联系我们
首页/微信公众账号投稿
帖子代码编辑/版权问题
QQ:435399051,1294855032
如何获得代码达人称号?
如何成为签约作者?
领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )