Android RecycleView实现不同样式Item样式效果完美解决

Android 控件RecyclerView的使用 Android 控件RecyclerView的使用 1.添加依赖 implementation 'androidx.recyclerview:recyclerview:1.0.0' 阅读详情

       在我们开发过程中经常会遇到需要我们展示不同样式列表的情况,通常我们都会使用ListView展示列表,然后实现BaseAdapter两个方法,即:getViewTypeCount() 和 getItemViewType(int position)即可实现

不过在Android Nougat Google发布了RecycleView之后,大家都纷纷弃ListView ,GridView,而使用RecycleView。所以今天我们写一个RecycleView实现不同Item条目样式的案例。

RecycleView和RecycleViewAdapter使用步骤:

1,初始化RecycleView及相关设置

     mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        //设置适配器管理器:LinearLayoutManager GridLayoutManager StaggeredGridLayoutManager(瀑布流),
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        //添加分割线
        mRecyclerView.addItemDecoration(new RecycleItemDecoration(context, RecycleItemDecoration.VERTICAL_LIST));

2,设置适配器和添加数据

<span style="white-space:pre">	</span>mRecyclerView.setAdapter(new RecycleAdapter(context, initData()));
 private List<Bean> initData() {

        List<Bean> mData = new ArrayList<>();
        for (int i = 'A'; i < 'Z'; i++) {

            Bean bean = new Bean();
            bean.setText((char) i + "");
            int type = i % 3;
            if (type == 0) {
                bean.setType(0);
            } else if (type == 1) {
                bean.setType(1);
            } else if (type == 2) {
                bean.setType(2);
            }

            mData.add(bean);
        }

        return mData;
    }

3,实现RecycleViewAdapter适配器并实现所需方法

通常实现常用列表样式只需要实现两个方法即可:

<span style="white-space:pre">	</span>public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
用来创建ViewHolder并将item布局添加ViewHolder中

 <span style="white-space:pre">	</span>public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position)
获取已绑定的ViewHolder对象并进行数据填充

而我们使用RecycleView实现不同Item样式的展示,同ListVIew一样,RecycleView也给我们提供了类似的方法,

 <span style="white-space:pre">	</span>public int getItemViewType(int position) 

获取指定苏索引条目的样式类型,返回值即为当前条目样式的类型(我总感觉应该是setItemViewType比较恰当)


通过这三部我们就基本可以使用RecycleView和RecycleAdapter实现列表和多种Item样式布局展示。下面我们展示详细代码:


/**
 * 作    者 :丁广帅
 * 创建日期 :2016/9/29 10:30
 * 描   述 :
 */

public class PerfertectFg extends BaseFragment {

    @SuppressLint("ValidFragment")
    public PerfertectFg(String tabNames, int tabIcons) {
        super(tabNames, tabIcons);
    }

    public PerfertectFg() {
    }


    private RecyclerView mRecyclerView;
    private Context context;

    @Override
    protected void onCreateViewLazy(Bundle savedInstanceState) {
        super.onCreateViewLazy(savedInstanceState);
        setContentView(R.layout.child_three);

        context = getContext();

        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        //设置适配器管理器:LinearLayoutManager GridLayoutManager StaggeredGridLayoutManager(瀑布流),
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        //添加分割线
        mRecyclerView.addItemDecoration(new RecycleItemDecoration(context, RecycleItemDecoration.VERTICAL_LIST));

        mRecyclerView.setAdapter(new RecycleAdapter(context, initData()));

    }

    private List<Bean> initData() {

        List<Bean> mData = new ArrayList<>();
        for (int i = 'A'; i < 'Z'; i++) {

            Bean bean = new Bean();
            bean.setText((char) i + "");
            int type = i % 3;
            if (type == 0) {
                bean.setType(0);
            } else if (type == 1) {
                bean.setType(1);
            } else if (type == 2) {
                bean.setType(2);
            }

            mData.add(bean);
        }
        return mData;
    }
}

借鉴鸿神的分割线样式:Android RecyclerView 使用完全解析 体验艺术般的控件

public class RecycleItemDecoration extends RecyclerView.ItemDecoration {


    /**
     * 读取attr资源
     */
    private static final int[] ATTRS = new int[]{
            android.R.attr.listDivider
    };

    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;

    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;

    private Drawable mDivider;

    //分割线高度
    private int mOrientation;

    public RecycleItemDecoration(Context context, int orientation) {
        final TypedArray a = context.obtainStyledAttributes(ATTRS);
        mDivider = a.getDrawable(0);
        a.recycle();
        setOrientation(orientation);
    }

    public void setOrientation(int orientation) {
        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
            throw new IllegalArgumentException("invalid orientation");
        }
        mOrientation = orientation;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent) {

        if (mOrientation == VERTICAL_LIST) {
            drawVertical(c, parent);
        } else {
            drawHorizontal(c, parent);
        }
    }


    /**
     * 绘制竖直方向分割线
     *
     * @param c
     * @param parent
     */
    public void drawVertical(Canvas c, RecyclerView parent) {
        final int left = parent.getPaddingLeft();
        final int right = parent.getWidth() - parent.getPaddingRight();

        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int top = child.getBottom() + params.bottomMargin;
            final int bottom = top + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    /**
     * 绘制水平方向分割线
     *
     * @param c
     * @param parent
     */
    public void drawHorizontal(Canvas c, RecyclerView parent) {
        final int top = parent.getPaddingTop();
        final int bottom = parent.getHeight() - parent.getPaddingBottom();

        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int left = child.getRight() + params.rightMargin;
            final int right = left + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    @Override
    public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
        //区别类型将分割线设置在下方和右方
        if (mOrientation == VERTICAL_LIST) {
            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
        } else {
            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
        }
    }

}
d RecycleView适配器实现,需要我们注意的一点是如果仅有一种Item样式RecycleAdapter的泛型我们直接写成自定义ViewHolder即可。如果是多种Item样式的话,RecycleAdapter泛型必须为RecycleView.ViewHolder,然后再进行强转

((ViewHolderA) holder).text.setText(mData.get(position).getText() + "------样式一");

/**
 * 作    者 :丁广帅
 * 创建日期 :2016/10/14 14:26
 * 描   述 :
 */

public class RecycleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    /**
     * RecycleViewAdapter 要素点:
     * <p/>
     * 1,ViewHolder必须继承RecyclerView.ViewHolder
     * 2,RecycleView.Adapter的泛型为自定义ViewHolder
     */


    private List<Bean> mData;
    private Context context;

    public enum Item_Type {
        RECYCLEVIEW_ITEM_TYPE_1,
        RECYCLEVIEW_ITEM_TYPE_2,
        RECYCLEVIEW_ITEM_TYPE_3
    }

    public RecycleAdapter(Context context, List<Bean> mData) {
        this.mData = mData;
        this.context = context;
    }


    /**
     * 创建ViewHolder
     *
     * @param parent
     * @param viewType :不同ItemView的类型
     * @return
     */
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        if (viewType == Item_Type.RECYCLEVIEW_ITEM_TYPE_1.ordinal()) {
            View mView = LayoutInflater.from(context).inflate(R.layout.recycle_item_a, null);
            ViewHolderA viewHolder = new ViewHolderA(mView);
            return viewHolder;

        } else if (viewType == Item_Type.RECYCLEVIEW_ITEM_TYPE_2.ordinal()) {

            View mView = LayoutInflater.from(context).inflate(R.layout.recycle_item_b, null);
            ViewHolderB viewHolder = new ViewHolderB(mView);
            return viewHolder;
        } else if (viewType == Item_Type.RECYCLEVIEW_ITEM_TYPE_3.ordinal()) {
            View mView = LayoutInflater.from(context).inflate(R.layout.recycle_item_c, null);
            ViewHolderC viewHolder = new ViewHolderC(mView);
            return viewHolder;
        }

        return null;
    }


    /**
     * 绑定数据:可以直接拿到已经绑定控件的Viewholder对象
     *
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {

        if (holder instanceof ViewHolderA) {
            ((ViewHolderA) holder).text.setText(mData.get(position).getText() + "------样式一");
        } else if (holder instanceof ViewHolderB) {
            ((ViewHolderB) holder).text.setText(mData.get(position).getText() + "------样式二");
        } else if (holder instanceof ViewHolderC) {
            ((ViewHolderC) holder).text.setText(mData.get(position).getText() + "------样式三");
        }

    }


    //返回值赋值给onCreateViewHolder的参数 viewType
    @Override
    public int getItemViewType(int position) {

        if (mData.get(position).getType() == 0) {
            return Item_Type.RECYCLEVIEW_ITEM_TYPE_1.ordinal();
        } else if (mData.get(position).getType() == 1) {
            return Item_Type.RECYCLEVIEW_ITEM_TYPE_2.ordinal();
        } else if (mData.get(position).getType() == 2) {
            return Item_Type.RECYCLEVIEW_ITEM_TYPE_3.ordinal();
        }
        return -1;
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }

    class ViewHolderA extends RecyclerView.ViewHolder {
        public TextView text;

        public ViewHolderA(View itemView) {
            super(itemView);
            text = (TextView) itemView.findViewById(R.id.text);
        }
    }


    class ViewHolderB extends RecyclerView.ViewHolder {

        public TextView text;

        public ViewHolderB(View itemView) {
            super(itemView);
            text = (TextView) itemView.findViewById(R.id.text);
        }
    }

    class ViewHolderC extends RecyclerView.ViewHolder {

        public TextView text;

        public ViewHolderC(View itemView) {
            super(itemView);
            text = (TextView) itemView.findViewById(R.id.text);
        }
    }


}





最后还是建议大家以后尽量使用RecycleView来替代ListVIew和GridView!!!


下载链接:http://download.youkuaiyun.com/detail/ding_gc/9655977



【我的Android进阶之旅】解决CardView四个圆角有白边的问题 **背景颜色的影响**:`CardView` 四周出现白边的原因通常是因为 `CardView` **默认情况下有一个背景颜色,它可能是白色或者其他不透明的颜色,用于显示卡片的阴影和圆角效果。** 如果这个背景颜色是白色或者与父布局的颜色不同,它会在边缘显现出来,使得它显示出你所看到的 **“白边”效果** 。 `CardView` 自带阴影效果和边框,当你使用图片作为背景时,这种效果可能会显得更加明显。 阅读详情

相关推荐

封包(一)(雷电模拟器+ProxyDroid+查尔斯3.93+WPE)

自从换了工作就没有给大家分享一些干活,在加上陪伴自己的孩子没有时间更新文章了,这只能在晚上给大家写文档了,我最近在游戏公司上班,研究封包。我把这些东西都做成了笔记,我想有些东西是大家都想弄明白d ...

寒梅独自开 1万+

RecycleView显示不同类型的Item

之前也用过listview来显示不同的item,不过现在recycleview出来那么久了,也越来越多人用了,现在我也觉得recycleview比listview好用了.所以就有了这篇文章,作者才疏学浅,如果有什么错的地方欢迎指正.如果你不熟悉recycleview,建议先熟悉它的用法下面demo仿造zaker的设置界面步骤 1. 创建不同类型的item对应的布局文件 2. 为每个类型的it

qq199208的专栏 6874

如何搭建一个vue项目(完整步骤)

查看版本的两种方式 出现版本号则说明安装成功(最新的以官网为准) 这里注意:安装vue-cli对node.js的版本是有要求的 装的两种方式:输入cmd命令 查看安装的版本(显示版本号说明安装成功) 如果你原来有版本或者版本比较低,可以升级...

m0_67392661的博客 5587

RecyclerView显示不同item的解决办法

RecyclerView显示不同item的解决办法 recyclerview和adapter使用方法很简单,在此不再赘述。 当RecyclerView需要显示不同item时,一般来说有两种解决方法。 场景示例:假设列表中需要显示音乐和广告,实体如下 public class Music{ private String name; //...省略其他信息} public class Ad{ private String merchant; private String content; //...省略其

qq_45436365的博客 3133

Synopsys SCL许可证服务器搭建详解:从安装到生成.dat文件

本文详细解析了Synopsys SCL许可证服务器的完整搭建流程,从系统环境准备、SCL安装到生成.dat文件。重点阐述了如何正确获取HOST ID、配置License文件以及调试常见故障,为数字芯片设计工程师提供了一套从零到一的实战避坑指南,确保EDA工具链稳定运行。

weixin_29306011的博客 612

用AI画电路板AI EDA初探Creating WiFi Radio with CELUS: A Step-by-Step Tutorial 使用CELU.IO创建WiFi收音机:分步教程

结论:整体还不太成熟,所选器件单元是欧美思维,器件选型成本和咱们华强北还是无法比。可以关注迭代,看客就当走马观花就行了;不过里面的单元模块还带有AI提问的这个比较好,值得国内EDA从业者学习。话不多说上正文:本教程目的是让我们深入了解如何使用CELUS设计平台构建WiFi收音机实战项目。本指南的重点是使用该平台来选择正确的解决方案,并整合一个项目,让您可以将音乐和节目从互联网直接传输到您自己构建的扬声器。

2301_81235726的博客 1万+

Android基础之--RecyclerView实现多种Item布局

本示例实现两种不通类型的Item布局,因此需要自定义2个ViewHolder,在ViewHolder中根据Id去获取各自Item布局中的控件;= null= nullinit{= null= nullinit{这里定义常量主要是作为重写getItemViewType方法的判断条件,即哪种情况下显示哪种Item布局;如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。

star_nwe的博客 2755

高通Camera PDAF调试实战:从Type2到Type3的避坑指南与Log分析技巧

本文深入解析高通Camera平台PDAF调试实战,重点对比Type2与Type3的核心差异,提供详细的配置迁移方案和Log分析技巧。针对常见兼容性问题如对焦速度变慢、低光失效等,给出具体解决方案,并分享性能优化案例与高级调试工具链,帮助开发者快速提升PDAF调试效率。

weixin_29164185的博客 413

RecycleView加载不同类型的Item

http://www.jianshu.com/p/05dd0315ef41 http://blog.youkuaiyun.com/qq199208/article/details/49386827

michael1112的专栏 1095

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

三菱FX5U系列PLC与汇川IT6000系列触摸屏进行MODBUS TCP通信的具体方法

Robot_PLC_HMI_Automation 6516

ArcGIS JSAPI 高级教程 - 添加多个 box 立方体 - 通过顶点、索引、UV 自定义每个 box、每个面不同颜色

ArcGIS JSAPI 高级教程 - 添加多个 box 立方体 - 通过顶点、索引、UV 自定义每个 box、每个面不同颜色。

非科班Java出身GISer的博客 402

Android仿QQ、微信ListView滑动删除item

最近做项目需要用到ListView滑动出现一个删除按钮来删除item,由于自己以前没做过,只能现学现卖,呵呵。百度一下资料还真不少,首先看到的是github上的开源项目SwipeListView库地址:https://github.com/47deg/android-swipelistview,项目和库一般不在一个地方,Example地址:https://github.com/47deg/andr

高磊的专栏 7568

ComfyUI 汉化教程(中文界面)

如果你对翻译的结果不满意,还可以进行修改。首先,进入目录,可以看到该目录中有很多 JSON 文件:打开 JSON 文件,找到要修改的内容,修改对应的Value值即可:最后,重启 ComfyUI 即可。

水滴的博客 1万+

SwipeRecyclerView滑动删除功能终极指南:打造流畅的Android列表交互体验

SwipeRecyclerView是一个功能强大的Android开源库,专门为RecyclerView提供了丰富的交互功能。其中最受欢迎的特性就是**滑动删除功能**,它让用户通过简单的手势操作就能完成列表项的删除,极大地提升了应用的用户体验。本文将深入解析SwipeRecyclerView滑动删除功能的实现原理和使用方法。 ## 🎯 什么是SwipeRecyclerView滑动删除? **

gitblog_01078的博客 318

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android之使用本地缓存数据

    前言:  在通常做项目的时候,需要存储数据,会使用GreenDAO数据库,bmob后端云,或者其他方法,以及本篇文章所讲解的本地缓存,也就是通过SharedPreferences,来进行缓存: 第一部分: 1.那么首先呢需要创建一个缓存数据的类CarStorage: 2.主要是创建了一个sparseArray的集合,那么sparseArray的性能存储方面,比hashmap更加...

LoverLeslie的博客 5375

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

RecyclerView用法--展示多种类型Item数据

如题,本文主要介绍RecyclerView的基本使用方法,像ListView一样展示多种类型的Item数据。 首先构造一个实体类:ItemPO,用来表示每个Item代表的数据类型: import java.io.Serializable; public class ItemPO implements Serializable { private static final long serialVersionUID = 7879752396036182745L; private

jb_home的博客 1286

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

RecyclerView的Item多种类型的选择和不同样式展示之利用框架方法实现

同样的道理,我们直接上效果图: 从这个示意图中也可以看出:其也是由三部分组成,头部+RecyclerView+尾部,只不过其头部比较复杂,所以我们采用一个第三方的框架: compile 'com.jakewharton:butterknife:7.0.1' //recyclerView头部框架 compile 'com.bartoszlipinski.recyclerview

willba的博客 1903

RecyclerView 实现动态添加不同的item模块并自动滑动到屏幕最下端实现

RecyclerView真的强大! 先上效果图,是你要的效果再看: 先上代码: 展示recyclerview的适配器,在这里适配器我引入的是第三方包装好的框架 万能适配器 //RecyclerViewAdapter 万能适配器框架使用 implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4' public class MultipleItemAdapter extends BaseMultiItemQuickA

RunningNewBie的博客 2031

RecyclerView详细介绍-----多item布局(三)

1.前言前面两篇文章主要介绍了recyclerview的基本使用,接下来介绍复杂一点的需求。 我们之前用listview的时候肯定遇到itemType>1的时候,我们定义多套item布局,借助getItemViewType()实现多套布局。但是如果像淘宝首页,上面是listview的一个一个item,下面确是一个GridView的话,我们如何实现呢?当然之前有人会把GridView用ListVie

曹银飞的专栏 6591

android EditText设置最多输入多少个字提示 ,并只取最多的那些字

private Context context; private EditText editText; private int maximum; public void setWordNumber(Context context, EditText editText, int maximum) { this.context = context; ...

Dr_abandon的博客 1282

RecyclerView的多item布局实现

android的列表控件实现多item布局

qq_36570506的博客 1147

Android内存泄漏的几种案例

1、单例和工具类造成的内存泄漏 单例是造成内存泄漏最常见的一种形式,单例对象的生命周期与Application一样长,当单例对象持有activity的引用的时候,activity销毁时候本该被内存回收,却无法回收,这就造成了内存泄漏。 public class AppManager { private static AppManager instance; private ...

fisheryujie的博客 678

Android ViewPager2实现视频与图片混合播放

ViewPager2实现视频与图片混合播放 最近公司需要完成一个视频与图片混合播放的功能,在网上搜索的半天,发现要么有问题,要么就是不达标,有的经过测试还有问题,因此我也是发了几天想想了自己做了一个 下面来看看我自己做的 先说说需求:需要实现图片轮播,且轮播时,视频需要暂停,过视频播放完成后,需要继续轮播,同时还要有连续播放,不能回头重播的效果,并且还需要在没有网络的情况下继续播放,这就需要进行缓存。 第一步添加权限 <uses-permission android:name="android.p

itheima123456的博客 3378

Android RecycleView 吸顶功能 支持LinearLayoutManager,GridLayoutManager,StaggeredGridLayoutManager

RecycleView吸顶功能

Leo_Liang_jie的博客 3434

【Android】自定义Toast样式

自定义Toast样式 原生Toast样式 自定义Toast样式 创建样式 所谓自定义一个Toast就是建立一个布局文件,然后使用一个view容器承载,然后显示出来。Toast毕竟只是起到一个提示作用,不必要放太多控件去填充,反而会显得内容很拥挤,一般一个标题,一张图片,一段简短文字即可。 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_pa

FranzLiszt的博客 7127
上一篇: Error:Execution failed for task ':app:clean'. > Unable to delete directory 终极解决方案
下一篇: 仿简书APP富文本编辑器实现
Henson_Ding
博客等级 码龄11年 22粉丝 36原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值