RecyclerView实现多布局-head轮播图

RecyclerView的动画及banner的用法 1.场景还原        这些天,在项目中我挖掘了很多实用的东西,趁今天有时间,给大伙分享一下:主要讲解RecyclerView的花式动画及banner的具体实现。先上图: 鉴于没有上传gif效果动画,口述一下demo效果:banner自动轮播,recyclerview上下翻动以动态的效果呈现,好了,该说说具体实现了! 2.RecyclerView的动画实现 ①先申明一个Recy 阅读详情

title: RecyclerView实现多布局+head轮播图
date: 2018-09-28 21:42:10
tags:

  • RecyclerView
  • 多布局
  • head轮播图
    categories: Android控件

本文看点:

  • RecyclerView 实现多布局
  • RecyclerView head轮播图
  • RecyclerView 自定义item点击事件接口
  • RecyclerView 实现上拉下拉刷新数据

Activity代码

/**
 * Created by Dell on 2017/5/10.
 * @author 小红妹
 * 科技模块类
 */
public class ScienceTechnology extends BaseFragment implements NewsJsonUtils.CallBackListener, SwipeRefreshLayout.OnRefreshListener{

    private View view;
    private RecyclerView mRecyclerView;
    private ScienceTechnologyAdapter adapterB;
    //下拉刷新控件
    private SwipeRefreshLayout sWipe;
    //记录最后一个下标
    private int mFootItem;
    //或取数据的工具类
    private NewsJsonUtils newsUtils;
    //保存了所有数据集合数组
    private List<NewsBeanData>[] msgSt;
    //从msgSt中获取科技信息
    private List<NewsBeanData> mData;
    //保存了所有图片播放数据集合
    private List<String> imgItem;
    //保存了所有标题数据集合
    private List<String> titleItem;
    //记录当前真正要显示item数据
    private List<NewsBeanData> nowItem;
    //记录当前存放的数据条数
    private int nowNum = 9;
    //记录每次刷新的数
    private final int NUM = 5;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        view = inflater.inflate(R.layout.hp_fm_news_fragment_b, container, false);
        initView();//调用初始化方法
        loadData();//调用加载数据方法
        drawRecyclerView();//调用RecyclerView点击事件方法
        initFootListener();//调用上拉加载事件监听方法
        return view;
    }

    /**
     * 初始化方法
     */
    private void initView() {
        imgItem = new ArrayList<>();
        titleItem = new ArrayList<>();
        nowItem = new ArrayList<>();
        //下拉刷新
        sWipe = (SwipeRefreshLayout) view.findViewById(R.id.swipe_layout);
        sWipe.setColorSchemeResources(android.R.color.holo_blue_bright);
        sWipe.setOnRefreshListener(this);

        mRecyclerView = (RecyclerView) view.findViewById(R.id.one_b_recycler_view);
        adapterB = new ScienceTechnologyAdapter(getActivity(), imgItem, titleItem, nowItem);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setAdapter(adapterB);
    }

    /**
     * RecyclerView点击事件方法
     */
    private void drawRecyclerView() {
        //RecyclerView点击事件
        adapterB.setOnItemClickListener(new ScienceTechnologyAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                String url = mData.get(position).getUrl();
                Intent intent = new Intent();
                intent.setClass(getActivity(), NewsDetailActivity.class);
                intent.putExtra("url",url);
                Log.e("URL", "onItemClick: "+ url);
                startActivity(intent);
            }
        });
    }

    /**
     * 上拉加载事件监听方法
     */
    private void initFootListener() {
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            //状态发生时触发
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_IDLE && mFootItem + 1 == adapterB.getItemCount()) {
                    mHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            nowNum += NUM;
                            initData();
                            sWipe.setRefreshing(false);
                        }
                    }, 1500);
                }
            }

            //滚动时监听
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                LinearLayoutManager lm = (LinearLayoutManager) recyclerView.getLayoutManager();
                mFootItem = lm.findLastVisibleItemPosition();
            }
        });
    }

    /**
     * 加载数据方法(获取网络数据)
     */
    @Override
    public void loadData() {
//        super.loadData();
        //注册本类去监听数据加载状态
        newsUtils = new NewsJsonUtils(this);
        //加载数据
        newsUtils.getUtils();
    }

    /**
     * 回调更新界面的方法
     * @param msgSt
     */
    @Override
    public void upData(List<OneBeanData> msgList, List<NewsBeanData>[] msgSt) {
        this.msgSt = msgSt;
        initData();//调用分配数据,填充布局的方法
    }

    //分配数据,填充布局的方法
    public void initData(){
        if (msgSt != null){
            imgItem.clear();//清空缓存
            titleItem.clear();
            nowItem.clear();
            mData = msgSt[4];
            for (int i = 0; i < 3; i++) {
                imgItem.add(mData.get(i).getThumbnail());
                titleItem.add(mData.get(i).getTitle());
            }
            for (int i = 3; i < nowNum; i++) {
                nowItem.add(mData.get(i));
            }
        }
        adapterB.notifyDataSetChanged();
    }

    /**
     * 下拉刷新方法
     */
    @Override
    public void onRefresh() {
        nowNum += NUM;//刷新操作执行后,显示增加的内容
        initData();//调用分配数据,填充布局的方法
        sWipe.setRefreshing(false);
    }

    public Handler mHandler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    };
}


主要看RecyclerView适配器

/**
 * Created by Dell on 2017/5/14.
 * @author 小红妹
 */
public class ScienceTechnologyAdapter extends RecyclerView.Adapter implements View.OnClickListener{

    private final int TYPE_HEAD = 0;//表示首个位置,直接显示图片播放
    private final int TYPE_NORMAL = 1;//表示正常的item布局
    private final int TYPE_FOOT = 2;//表示刷新布局
    private Context mContext;
    //保存了所有图片播放数据集合
    private List<String> imgItem;
    private List<String> titleItem;
    //记录当前真正要显示item数据
    private List<NewsBeanData> nowItem;

    //新建一个私有变量用于保存用户设置的监听器
    private OnItemClickListener mOnItemClickListener = null;

    //set方法:
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.mOnItemClickListener = listener;
    }

    @Override
    public void onClick(View v) {
        if (mOnItemClickListener != null) {
            //注意这里使用getTag方法获取position
            mOnItemClickListener.onItemClick(v,(int)v.getTag());
        }
    }

    //define interface 自定义一个接口
    public static interface OnItemClickListener {
        void onItemClick(View view, int position);
    }

    /**
     * 构造方法
     * @param mContext
     * @param imgItem
     * @param titleItem
     * @param nowItem
     */
    public ScienceTechnologyAdapter(Context mContext, List<String> imgItem, List<String> titleItem, List<NewsBeanData> nowItem){
        this.mContext=mContext;
        this.imgItem = imgItem;
        this.titleItem = titleItem;
        this.nowItem = nowItem;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder holder=null;
        if (viewType==TYPE_HEAD){
            //此处创建顶部banner的ViewHolder
            holder = new BannerViewHolder(LayoutInflater.from(mContext).inflate(R.layout.news_banner_imager_b, parent, false));
        }else if (viewType==TYPE_NORMAL){
            View view = LayoutInflater.from(mContext).inflate(R.layout.news_banner_top, parent, false);
            holder = new ItemViewHolder(view);
            //将创建的View注册点击事件
            view.setOnClickListener(this);
        }else if (viewType==TYPE_FOOT){
            holder = new FootViewHolder(LayoutInflater.from(mContext).inflate(R.layout.news_item_footer, parent, false));
        }

        return holder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        if (holder instanceof BannerViewHolder){
            BannerViewHolder bannerViewHolder = (BannerViewHolder) holder;
            bannerViewHolder.banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR_TITLE);
            bannerViewHolder.banner.setBannerTitles(titleItem);
            bannerViewHolder.banner.setImages(imgItem);
            bannerViewHolder.banner.setImageLoader(new GlideImageLoader());
            bannerViewHolder.banner.start();
        } else if (holder instanceof ItemViewHolder) {
            //处理每个item里的布局
            ItemViewHolder itemViewHolder = (ItemViewHolder) holder;
            itemViewHolder.simpleDraweeView.setImageURI(nowItem.get(position-1).getThumbnail());
            itemViewHolder.textView.setText(nowItem.get(position-1).getTitle());//从零开始
            //item的高度
            ViewGroup.LayoutParams layoutParams = itemViewHolder.itemView.getLayoutParams();
            layoutParams.height = LinearLayout.LayoutParams.WRAP_CONTENT;
        }
        //将position保存在itemView的Tag中,以便点击时进行获取
        holder.itemView.setTag(position);
    }

    @Override
    public int getItemCount() {
        return nowItem.size()+1+1;
    }

    /**
     * 告诉创建什么类型的ViewHolder
     * @param position
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        if (position==0){
            return TYPE_HEAD;
        }else if (position+1==getItemCount()){
            return TYPE_FOOT;
        }else {
            return TYPE_NORMAL;
        }
    }

    /**
     * 正常的ViewHolder
     */
    class ItemViewHolder extends RecyclerView.ViewHolder{
        SimpleDraweeView simpleDraweeView;
        TextView textView;

        public ItemViewHolder(View itemView) {
            super(itemView);
            simpleDraweeView = (SimpleDraweeView) itemView.findViewById(R.id.simple_view);
            textView=(TextView) itemView.findViewById(R.id.item_banner);
        }
    }
    /**
     * 首位的ViewHolder
     */
    class BannerViewHolder extends RecyclerView.ViewHolder {
        Banner banner;
        public BannerViewHolder(View itemView) {
            super(itemView);
            banner = (Banner) itemView.findViewById(R.id.banner);
        }
    }
    /**
     * 底部的ViewHolder(上拉加载)
     */
    class FootViewHolder extends RecyclerView.ViewHolder{

        public FootViewHolder(View itemView) {
            super(itemView);
        }
    }
}

RecyclerView垂直多条Items广告轮播Demo 实现多条同时显示广告轮播更新功能;动态数据添加删减中防止Recycler设计中的数组越界异常! 立即下载

相关推荐

可添加头部和尾部的 RecyclerView

可添加 头布局和尾布局的 RecyclerView

用RecyclerView打造一个轮播图

至于自动滑动图片,就用Handler不断延迟发送消息就好了: private Handler mHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { if (msg. Android开源项目《ali1024.coding.net/public/P7/Android/git》 what == WHAT_AUTO_PLAY) { mRecyclerView.smoo

m0_69440446的博客 2072

Android-RecyclerView优雅的实现多条目布局

RecyclerView优雅的实现多条目布局

Android框架之路——Banner实现轮播图(RecyclerView添加Header)

一、简介 Banner能实现循环播放多个广告图片和手动滑动循环等功能。因为原生ViewPager并不支持循环翻页, 要实现循环还得需要自己去动手。Banner框架可以进行不同样式、不同动画设置, 以及完善的api方法能满足大部分软件首页轮播图效果的需求。 有一篇博客讲了一些,可以参考banner框架,一个比较齐全的框架; 此项目的Github地址:链接。 本篇教程依

等一杯咖啡的博客 2万+

Banner实现轮播图(RecyclerView添加Header)实例 下载

配合博客:Android框架之路——Banner实现轮播图(RecyclerView添加Header)

使用RecyclerViewHeader一键添加RecyclerView头布局并实现轮播效果 实例源码下载

使用RecyclerViewHeader一键添加RecyclerView头布局并实现轮播效果

android -------- RecyclerView的可(多个Item水平,垂直)滚动列表的实现

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34082854的博客 934

Recycleview实现无限自动轮播

概述 RecycleView实现特定数据无限重复滑动在我看来不外乎有两种方法 1.修改adpter的复用机制,无限复用数据 2.在adpter中返回数据长度返回Integer的最大值 由于第一种虽然能实现数据的无限重复但是数据位还是没有任何变化,所以在自动跳转至最后的时候无法在向下一位轮播,所以在这里我使用第二种方式实现自动轮播 简单讲述修改adpter的复用机制 我们拿LinearLayoutManager线性的为例子,我们只需要重新LinearLayoutManager在绘制的时候做一些手手脚就可以实现 package com.li.liproject.recycle; import

打造基于RecyclerView的Banner广告

在项目开发过程中,我们经常会收到广告轮播图的需求。之前都是用Viewpager来实现,也用到了些许第三方的的广告轮播库。今天介绍下基于RecyclerView实现广告轮播效果。 主要实现了: Banner无限滚动 自动轮播 RecyclerView 每次滑动切换一项 可自定义轮播图样式 可设置滑动速度和每个轮播图停留的时间 可自定义数据源 主要方法如下: 方法名 作用 set...

weixin_43853568的博客 2835

NVMe-MI --- Message Servicing Model(消息服务模型)

本文主要介绍NVMe-MI消息服务模型,两个主要类别是请求消息和响应消息。并介绍带外机制消息服务状态机。

智小星的博客 2009

手把手教你学Simulink——基于Simulink的轮毂电机独立驱动转矩矢量分配

阐述了轮毂电机独立驱动的核心价值与转矩分配的必要性在 Simulink 中实现了完整的“上层稳定控制 + 下层最优分配”架构对比了三种分配策略在极限工况下的性能差异提供了工程落地的关键考量特斯拉 Cybertruck(后轮双电机矢量控制)Rivian R1T(四电机坦克掉头)宝马 iX(精准牵引力控制)核心思想“以软件定义底盘,以算法驾驭动力;化四轮之独立,为整车之协同。—— 让汽车在极限边缘依然从容不迫。

MHD0815的博客 368

android 给多列的RecycleView添加头布局

在工作中遇到商城类的界面,界面上半部分是viewpager,下部分是多列的GridView,具体实现: 1、在设置RecycleView的manager时使用GridlayoutManager的 setSpanSizeLookup属性设置头布局所占的宽度: manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup()

yikunhan的博客 2056

Sourcetree与Gitee的完美协作:从身份验证到推送成功的全流程指南

本文提供了一份详细的Sourcetree与Gitee协作全流程指南,重点解决身份验证失败、Git版本配置及远端仓库设置等常见问题。通过分步讲解,帮助用户掌握从克隆、提交到成功推送的完整操作,并整合了使用个人访问令牌进行身份验证等关键热词信息,确保Windows与MacOS用户都能顺畅完成代码管理。

m2n3b4v5c6的博客 708

实现无限轮播广告条如此简单

前言: 公司产品需要新增悬浮广告条的功能,要求是可以循环滚动,并且点击相应的浮条会跳转到相应的界面,在实现这个功能的时候遇到一些坑,幸运的是最后从这些坑中爬了出来。这篇文章的主要内容就是介绍功能的实现以及爬坑的经验。 效果展示   在文章开始前,先看下最后实现的效果,最终的效果如下图 需求分析   我们已经知道了产品的需求,下面要做的就是分析这个需求应该怎样实现,首先我们要实现的功能就是让广...

fnhfire_7030的博客 2295

用COMSOL计算复合材料板频散曲线:从建模到绘图全流程

导波在板结构中传播时,不同频率成分的速度不同,即频散现象。理解频散曲线是识别导波模态、确定相速度与群速度的基础,也是无损检测和结构健康监测中信号解读的关键。对于碳纤维增强复合材料等各向异性板,频散关系更加复杂,传统解析方法难以求解,数值仿真成为主流手段。通过COMSOL结合周期性边界条件与特征频率扫描,可以高效计算出复合材料板的频散曲线,进而绘制相速度和群速度随频率变化的图谱,为实验模态识别、换能器激励频率选择提供依据。本文以一个2毫米单向碳纤维板为例,详细介绍几何建模、材料参数设置、网格收敛验证、参数扫描

weixin_31412781的博客 233

APB Timer验证环境搭建——学习笔记(1)

以下为个人学习笔记,如有疏漏,请大家指正补充~~APB Timer是一个简单的下行计数器,包括一个32位计数器和一组比较器,可以实现多种计时功能。包括生成一次性中断或者定时中断。

qq_41651535的博客 1578

android新特性:使用RecyclerViewHeader一键添加RecyclerView头布局并实现轮播效果

首先看一下效果吧 20170123112552092.png 自android5.0以来,RecyclerView的已经是android开发中不可缺少的控件了,他的方便不用多说了,那么使用RecyclerView当然不能像listview一样直接添加头布局了,那么RecyclerView该怎么一键添加头布局,并实现轮播图效果呢? 首先要引入几个类库

旺仔的专栏 2771

Adversarial Texture for Fooling Person Detectors in the Physical World

本文提出了对抗纹理的想法(AdvTexture),与基本补丁攻击不同对抗纹理可以生成任意大小,可以覆盖任意大小的不了,并且纹理的任何局部都有对抗性的效果。当衣服被对抗纹理覆盖是,摄像头捕捉到的每一个局部区域都可以攻击探测器,这成功解决了片段缺失的问题。提出了一种两阶段生成方法:基于环形收割的可扩展生成攻击(TC-EGA)来制作广告纹理。第一阶段,训练一个全卷积网络FCN作为生成器,通过采样随机潜变量作为输入来产生纹理(不同于GAN中传统的生成器架构,每一层都使用卷积运算)......

weixin_49171105的博客 1067

RecyclerView展示多种布局

按照惯例 先看看效果图简介最上面是一个轮播图,然后下面是一个横向滑动的频道,然后下面就是一个GridView,再下面就是正常的布局显示了 当然这还不算是很复杂的布局,我这边只是讲讲原理和实现步骤,更多复杂布局可以根据这个去扩展原理给不同position的item设置不同的layout布局, 绑定不同的ViewHolder实现步骤1,定义不同的viewType常量(非必须) 2,在getItemV

段炼 1万+

AI开发助手介绍

AI开发助手介绍随着NLP方向发展越来越成熟,AI写代码领域出现了几个非常好的模型,今天笔者给大家推荐几个AI Coding 助手AI Coding助手是以IDEA插件或vim插件形式提供服务,在编辑器中写代码时,可以实时预测下一行要输入的代码,提升开发效率。Github Copilot首先要介绍的是Github Copilot,Copilot是个AI Coding助手,它从注释和代码中提取上下文,给出单行和整个函数的代码建议,Copilot由Open AI 的CodeX模型提供支持,它是一个由OpenAI

bobo_simpler的博客 5765

【论文解读】Baidu Apollo EM Motion Planner

系统顶层是一种多车道策略,通过并行计算车道级别轨迹来处理车道变更场景;在车道轨迹生成器内部,迭代的解决基于Frenet坐标的路径和速度规划;针对路径和速度规划问题,提出了动态规划与基于样条的二次规划相结合的方法,构造了一个可扩展且易于调整的框架,同时处理交通规则、障碍物决策和平滑度问题。该规划器可扩展至高速公路和城市低速驾驶场景。高精地图模块提供了任何人都可以访问的高精地图。感知和定位模块提供了动态环境中必要的信息。运动规划模块考虑生成一条安全平滑的轨迹再交由汽车的控制模块去执行。

xiewf的博客 6092

【Android】用RecycleView实现可以横向滚动的ListView效果

终于闲下来了,总结一下RecycleView的使用。 一、概述 与常见的ListView和GridView一样,RecycleView也用来在有限的界面上展示大量的数据。它提供了一种插拔式的体验,高度的解耦,使用非常灵活,可以通过support-v7包进行导入。先看以下RecycleView可以实现的效果: (单列上下滚动) (多列上下滚动) (多项横向滚动) (瀑布流)

catshitone的专栏 9705

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

使用recyclerView实现无限循环banner效果

新接到的任务就是要搞个能快速滑动好几页的banner控件,之前用的是viewpager实现,尝试过基于viewpager改感觉不太好实现,后面在群友推荐下改用了recycleview,大概都实现了。 首先感谢这个库RecyclerViewCardGallery-android使用RecyclerView实现Gallery画廊效果 github.com/huazhiyuan2… 实现效果如下: ...

weixin_34242331的博客 1419

OV9734 DATASHEET,完整规格书

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android Fragment 巧妙利用 show和hide

Android Fragment 巧妙利用 show和hide。这里咱们分两种情况来做相应的处理。

小红妹 3373

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: Error:could not pen "D:\JRE\lib\amd64\jvm.cfg
下一篇: Android RecyclerView 子条目(item)嵌套 RecyclerView
小红妹
博客等级 码龄10年 151粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值