当前位置:首页 » 《随便一记》 » 正文

Android RecyclerView简单又万能适配器BaseRecyclerViewAdapterHelper+SuperTextView_qq_38186359的博客

0 人参与  2022年05月19日 12:34  分类 : 《随便一记》  评论

点击全文阅读


Android开发过程中大家一定或多或少都碰到过RecyclerView写适配器的麻烦,重复写,代码篇幅长,等等一系列的问题。今天就说说BaseRecyclerViewAdapterHelper这个帮助

节省代码量的万能适配器了,最简单的使用,能改减少适配器中一半以上的代码量。但是只是这样还是不够简单便捷,再加上一个万能的控件SuperTextView,那才可以叫做真!万能适配器!先给大家上这两个库的GitHub地址:

https://github.com/CymChad/BaseRecyclerViewAdapterHelperhttps://github.com/CymChad/BaseRecyclerViewAdapterHelper

 GitHub - lygttpod/SuperTextView: a super textview for androida super textview for android. Contribute to lygttpod/SuperTextView development by creating an account on GitHub.https://github.com/lygttpod/SuperTextView

然后开始我们的RecyclerView万能适配器的使用步骤:

首先先在项目中集成 在app下的build.gradle文件中的dependencies加入

 implementation 'com.github.lygttpod:SuperTextView:2.4.6'  超级TextVie万能控件

implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.7'  万能适配器

记得保证根目录的 build.gradle下的repositories已经加入了

 allprojects {

         repositories {

            ...

            maven { url "https:jitpack.io" }

        }

    }

正式使用前我们得先了解一下SuperTextView, 下图是SuperTextView的作者给的一些效果图,其实大家理解SuperTextView就是一个能帮我们生成好我们常用的一些TextView、ImageView、checkBox等等一些控件并且帮我们摆放好,甚至做好了我们常用的某些效果的的工具。

为了方便大家理解,我使用SuperTextView部分属性简单写了一个效果,相信大家都能一眼就明白这些意思。

 

 SuperTextView还有很多很多的属性设置,这些属性通通都可以在代码中以及xml中去使用。

属性名字段描述默认值
sLeftTextStringstring左边文字字符串
sLeftTopTextStringstring左上文字字符串
sLeftBottomTextStringstring左下文字字符串
sCenterTextStringstring中间文字字符串
sCenterTopTextStringstring中上文字字符串
sCenterBottomTextStringstring中下文字字符串
sRightTextStringstring右边文字字符串
sRightTopTextStringstring右上文字字符串
sRightBottomTextStringstring右下文字字符串
sLeftTextColorcolor左边文字颜色默认0xFF373737
sLeftTopTextColorcolor左上文字颜色默认0xFF373737
sLeftBottomTextColorcolor左下文字颜色默认0xFF373737
sCenterTextColorcolor中间文字颜色默认0xFF373737
sCenterTopTextColorcolor中上文字颜色默认0xFF373737
sCenterBottomTextColorcolor中下文字颜色默认0xFF373737
sRightTextColorcolor左边文字颜色默认0xFF373737
sRightTopTextColorcolor右上文字颜色默认0xFF373737
sRightBottomTextColorcolor右下文字颜色默认0xFF373737
sLeftTextSizedimension左边字体大小默认15sp
sLeftTopTextSizedimension左上字体大小默认15sp
sLeftBottomTextSizedimension左下字体大小默认15sp
sCenterTextSizedimension中间字体大小默认15sp
sCenterTopTextSizedimension中上字体大小默认15sp
sCenterBottomTextSizedimension中下字体大小默认15sp
sRightTextSizedimension右边字体大小默认15sp
sRightTopTextSizedimension右上字体大小默认15sp
sRightBottomTextSizedimension右下字体大小默认15sp
sLeftLinesinteger左边文字显示行数默认不设置
sLeftTopLinesinteger左上文字显示行数默认不设置
sLeftBottomLinesinteger左下文字显示行数默认不设置
sCenterLinesinteger中间文字显示行数默认不设置
sCenterTopLinesinteger中上文字显示行数默认不设置
sCenterBottomLinesinteger中下文字显示行数默认不设置
sRightLinesinteger右边文字显示行数默认不设置
sRightTopLinesinteger右上文字显示行数默认不设置
sRightBottomLinesinteger右下文字显示行数默认不设置
sLeftMaxEmsinteger左边文字显示个数默认不设置
sLeftTopMaxEmsinteger左上文字显示个数默认不设置
sLeftBottomMaxEmsinteger左下文字显示个数默认不设置
sCenterMaxEmsinteger中间文字显示个数默认不设置
sCenterTopMaxEmsinteger中上文字显示个数默认不设置
sCenterBottomMaxEmsinteger中下文字显示个数默认不设置
sRightMaxEmsinteger右边文字显示个数默认不设置
sRightTopMaxEmsinteger右上文字显示个数默认不设置
sRightBottomMaxEmsinteger右下文字显示个数默认不设置
sLeftViewGravityenum左边文字对齐方式
left_center(左对齐)
center(居中)
right_center(右对齐)
默认center
sCenterViewGravityenum中间文字对齐方式
left_center(左对齐)
center(居中)
right_center(右对齐)
默认center
sRightViewGravityenum右边文字对齐方式
left_center(左对齐)
center(居中)
right_center(右对齐)
默认center
sLeftTvDrawableLeftreference左边TextView左侧的drawable
sLeftTvDrawableRightreference左边TextView右侧的drawable
sCenterTvDrawableLeftreference中间TextView左侧的drawable
sCenterTvDrawableRightreference中间TextView右侧的drawable
sRightTvDrawableLeftreference右边TextView左侧的drawable
sRightTvDrawableRightreference右边TextView右侧的drawable
sLeftTvDrawableWidthdimension左边TextView的drawable的宽度
sLeftTvDrawableHeightdimension左边TextView的drawable的高度
sCenterTvDrawableWidthdimension中间TextView的drawable的宽度
sCenterTvDrawableHeightdimension中间TextView的drawable的高度
sRightTvDrawableWidthdimension右边TextView的drawable的宽度
sRightTvDrawableHeightdimension右边TextView的drawable的高度
sTextViewDrawablePaddingdimensionTextView的drawable对应的Padding默认10dp
sLeftViewWidthdimension左边textView的宽度 为了中间文字左对齐的时候使用
sTopDividerLineMarginLRdimension上边分割线的MarginLeft和MarginRight默认0dp
sTopDividerLineMarginLeftdimension上边分割线的MarginLeft默认0dp
sTopDividerLineMarginRightdimension上边分割线的MarginRight默认0dp
sBottomDividerLineMarginLRdimension下边分割线的MarginLeft和MarginRigh默认0dp
sBottomDividerLineMarginLeftdimension下边分割线的MarginLeft默认0dp
sBottomDividerLineMarginRightdimension下边分割线的MarginRight默认0dp
sDividerLineColorcolor分割线的颜色默认0xFFE8E8E8
sDividerLineHeightdimension分割线的高度默认0.5dp
sDividerLineTypeenum分割线显示方式
none(不显示分割线)
top(显示上边的分割线)
bottom(显示下边的分割线)
both(显示上下两条分割线)
默认bottom
sLeftViewMarginLeftdimension左边view的MarginLeft默认10dp
sLeftViewMarginRightdimension左边view的MarginRight默认10dp
sCenterViewMarginLeftdimension中间view的MarginLeft默认10dp
sCenterViewMarginRightdimension中间view的MarginRight默认10dp
sRightViewMarginLeftdimension右边view的MarginLeft默认10dp
sRightViewMarginRightdimension右边view的MarginRight默认10dp
sLeftTextIsBold(移除)boolean左边文字是否加粗默认false(暂时去除此属性改为代码动态配置)
sLeftTopTextIsBold(移除)boolean左上文字是否加粗默认false(暂时去除此属性改为代码动态配置)
sLeftBottomTextIsBold(移除)boolean左下文字是否加粗默认false(暂时去除此属性改为代码动态配置)
sCenterTextIsBold(移除)boolean中间文字是否加粗默认false(暂时去除此属性改为代码动态配置)
sCenterTopTextIsBold(移除)boolean中上文字是否加粗默认false(暂时去除此属性改为代码动态配置)
sCenterBottomTextIsBold(移除)boolean中下文字是否加粗默认false(暂时去除此属性改为代码动态配置)
sRightTextIsBold(移除)boolean右边文字是否加粗默认false(暂时去除此属性改为代码动态配置)
sRightTopTextIsBold(移除)boolean右上文字是否加粗默认false(暂时去除此属性改为代码动态配置)
sRightBottomTextIsBold(移除)boolean右下文字是否加粗默认false(暂时去除此属性改为代码动态配置)
sLeftIconResreference左边图片资源 可以用来显示网络图片或者本地
sRightIconResreference右边图片资源 可以用来显示网络图片或者本地
sLeftIconWidthdimension左边图片资源的宽度 用于固定图片大小的时候使用
sLeftIconHeightdimension左边图片资源的高度 用于固定图片大小的时候使用
sRightIconWidthdimension右边图片资源的宽度 用于固定图片大小的时候使用
sRightIconHeightdimension右边图片资源的高度 用于固定图片大小的时候使用
sLeftIconMarginLeftdimension左边图片资源的MarginLeft默认10dp
sRightIconMarginRightdimension右边图片资源的MarginLeft默认10dp
sCenterSpaceHeightdimension上中下三行文字的间距默认5dp
sRightCheckBoxResreference右边CheckBox的资源
sRightCheckBoxMarginRightdimension右边CheckBox的MarginRight默认10dp
sIsCheckedboolean右边CheckBox是否选中默认 false
sUseRippleboolean是否开启点击出现水波效果默认 true
sBackgroundDrawableResreferenceSuperTextView的背景资源
sRightViewTypeenum右边显示的特殊View
checkbox
switchBtn
默认都不显示
sRightSwitchMarginRightdimension右边SwitchBtn的MarginRight默认10dp
sSwitchIsCheckedboolean右边SwitchBtn是否选中默认 false
sTextOffstringTextOff默认""
sTextOnstringTextOn默认""
sSwitchMinWidthdimensionSwitchMinWidth系统默认
sSwitchPaddingdimensionSwitchPadding系统默认
sThumbTextPaddingdimensionThumbTextPadding系统默认
sThumbResourcereference右边SwitchBtn自定义选中资源系统默认
sTrackResourcereference右边SwitchBtn自定义未选中资源系统默认
sUseShapeboolean是否使用shape设置圆角及触摸反馈
设为true之后才能使用一下属性
默认false
sShapeSolidColorcolor填充色默认false
sShapeSelectorPressedColorcolor按下时候的颜色默认0xffffffff
sShapeSelectorNormalColorcolor正常显示的颜色默认0xffffffff
sShapeCornersRadiusdimension四个角的圆角半径默认0dp
sShapeCornersTopLeftRadiusdimension左上角的圆角半径默认0dp
sShapeCornersTopRightRadiusdimension右上角的圆角半径默认0dp
sShapeCornersBottomLeftRadiusdimension左下角的圆角半径默认0dp
sShapeCornersBottomRightRadiusdimension右下角的圆角半径默认0dp
sShapeStrokeWidthdimension边框宽度默认0dp
sShapeStrokeDashWidthdimension虚线宽度默认0dp
sShapeStrokeDashGapdimension虚线间隙宽度默认0dp
sShapeStrokeColorcolor边框颜色默认0dp
sLeftTextBackgroundreference左边textView的背景
sCenterTextBackgroundreference中间textView的背景
sRightTextBackgroundreference右边textView的背景
sLeftTextGravityenum左边TextView内文字对齐方式
left(左对齐)
center(居中)
right(右对齐)
默认left
sCenterTextGravityenum中间TextView内文字对齐方式
left(左对齐)
center(居中)
right(右对齐)
默认left
sRightTextGravityenum右边TextView内文字对齐方式
left(左对齐)
center(居中)
right(右对齐)
默认left
sLeftIconShowCircleboolean左边ImageView是否显示为圆形默认false
sRightIconShowCircleboolean右边ImageView是否显示为圆形默认false

如果这些属性还不能完全满足你的要求,可以直接获取你想要修改的地方,再加工做到你需要的效果,例如你想要获取左上的文字只需要:

SuperTextView.getLeftTopTextView();

这样即可得到左上角文字返回的TextView,其他的地方也一样以此类推即可得到相对应的控件。

在了解SuperTextView的使用以后就是BaseRecyclerViewAdapterHelper的使用了。通常我们在创建适配器的时候都需要一个相对应的layout文件来写适配器的Item,但是基于但是基于SuperTextView,我们的layout文件就能变得很简单,

 只需要一个SuperTextView就能满足百分之八十左右的Item需求了。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <com.allen.library.SuperTextView
        android:id="@+id/stv"
        android:padding="15dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

</LinearLayout>

有了Item的layout文件以后我们就可以开始写适配器了。

新建一个class需要继承BaseQuickAdapter<>里面有两个泛型, 第一个是实体类,第二个直接写BaseViewHolder, 是为了支持扩展ViewHolder, 因为我们的目的是做一个万能的适配器我们需要支持所有数据类型,所以第一个实体类我们直接用Object,之后需要操作数据的时候我们再通过类型判断来强制转换成我们需要的类型即可。然后就能生成一个构造函数,以及一个convert方法,主要操作是在convert,我们这里通过构造函数传进来一个类型值,判断当前适配器需要的数据类型,以及SuperTextView需要实现的样式。

我们在convert方法中获取我们的SuperTextView控件,然后根据类型值判断需要转换的数据类型。再根据自己的需求去完成SuperTextView需要的样式,并且赋值,就完成了我们的万能适配器了。看了一大推说明,相信大家都看烦了。

小二!上代码!

首先是两个数据类型。

//一个商品相关Bean
public class MainBean {
    private String name;  //商品名称
    private String num;   //商品数量
    private String price;  //商品价格

    public MainBean(String name, String num, String price) {
        this.name = name;
        this.num = num;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNum() {
        return num;
    }

    public void setNum(String num) {
        this.num = num;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }
}

另一个数据类型

//一个学生成绩相关Bean
public class SubBean {
    private String name;  //学生姓名
    private String curriculum;  //科目
    private String number;      //学号
    private String fraction;    //分数

    public SubBean(String name, String curriculum, String number, String fraction) {
        this.name = name;
        this.curriculum = curriculum;
        this.number = number;
        this.fraction = fraction;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCurriculum() {
        return curriculum;
    }

    public void setCurriculum(String curriculum) {
        this.curriculum = curriculum;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getFraction() {
        return fraction;
    }

    public void setFraction(String fraction) {
        this.fraction = fraction;
    }
}

接下来我在Activity中写两个RecyclerView, 通过一个适配器实现使用两个不同的数据类型实现两个效果,首先看看xml。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".AdapterActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="效果1,商品列表"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:gravity="center"
        />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_main"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="效果2,学生成绩列表"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"
        android:gravity="center"
        />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_sub"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        />


</LinearLayout>

很简单,就两个RecycleView 和两个TextView

接下来就是适配器代码:

public class Adapter extends BaseQuickAdapter<Object, BaseViewHolder> {
    private int type;
    //type为0是商品, 为1是成绩
     public Adapter(int type) {
        super(R.layout.item_adapter);
        this.type = type;
    }

    @Override
    protected void convert(BaseViewHolder baseViewHolder, Object o) {
        SuperTextView stv = baseViewHolder.getView(R.id.stv);
        //根据type区分使用的数据类型以及样式
        switch (type) {
            case 0:
                //数据类型强制转换商品列表数据
                MainBean main = (MainBean) o;
                //左边文字
                stv.setLeftString("商品名:" + main.getName());
                //中间文字
                stv.setCenterString("商品价格:" + main.getPrice());
                //右边文字
                stv.setRightString("商品数量:" + main.getNum());
                break;
            case 1:
                //数据类型强制转换学生成绩列表数据
                SubBean sub = (SubBean) o;
                //左上文字
                stv.setLeftTopString(sub.getName());
                //左下文字
                stv.setLeftBottomString(sub.getNumber());
                //右上文字
                stv.setRightTopString(sub.getCurriculum());
                //右下文字
                stv.setRightBottomString(sub.getFraction());
                break;
        }
    }

}

最后就是使用,Activity代码

public class AdapterActivity extends AppCompatActivity {
    //商品列表控件
    private RecyclerView rv_main;
    //成绩列表控件
    private RecyclerView rv_sub;
    //商品数据
    private List<MainBean> mainList = new ArrayList<>();
    //成绩数据
    private List<SubBean> subList = new ArrayList<>();
    //万能适配器
    private Adapter universalAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_adapter);
        //实例化
        rv_main = findViewById(R.id.rv_main);
        rv_sub = findViewById(R.id.rv_sub);
        //给数据上值
        mainList.add(new MainBean("冬瓜","50","0.98"));
        mainList.add(new MainBean("西瓜","30","0.77"));
        mainList.add(new MainBean("哈密瓜","70","0.88"));
        mainList.add(new MainBean("傻瓜","1","250"));

        subList.add(new SubBean("张三","语文","000012","90"));
        subList.add(new SubBean("张三","数学","000012","88"));
        subList.add(new SubBean("张三","英语","000012","92"));
        subList.add(new SubBean("张三","计算机","000012","0"));

        setMainAdapter();
        setSubAdapter();
    }

    private void setMainAdapter() {
        //实例化适配器
        universalAdapter = new Adapter(0);
        //配置RecyclerView
        rv_main.setLayoutManager(new LinearLayoutManager(this));
        rv_main.setAdapter(universalAdapter);
        //给适配器设置数据
        universalAdapter.setList(mainList);
        //给Item点击事件
        universalAdapter.setOnItemChildClickListener(new OnItemChildClickListener() {
            @Override
            public void onItemChildClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
                //这样可以获取到点击行的数据 如何使用我就不赘述了
                adapter.getData().get(position);
            }
        });
    }

    private void setSubAdapter() {
        //实例化适配器
        universalAdapter = new Adapter(1);
        //配置RecyclerView
        rv_sub.setLayoutManager(new LinearLayoutManager(this));
        rv_sub.setAdapter(universalAdapter);
        //给适配器设置数据
        universalAdapter.setList(subList);
    }

}

最后我们看看跑起来的样子

就这样,万能适配器的代码就讲完了,实际代码其实很少,主要是为了方便新手们理解我讲得稍微有点啰嗦了。

其实BaseRecyclerViewAdapterHelper还有很多功能大家可以自己去拓展,比如下拉菜单啊,刷新加载更多之类,SuperTextView和BaseRecyclerViewAdapterHelper远远比我介绍的强大很多很多,大家可以去github上看看源码,掌握更多的用法。

另外本人创建了个


点击全文阅读


本文链接:http://zhangshiyu.com/post/40442.html

默认  文字  适配器  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1