RecyclerView的使用

从接口读取数据,Json解析后显示在RecyclerView上 第一步 导入volley框架,以便进行网络请求,并添加依赖 第二步 添加网络权限,在AndroidManifest.xml中添加 uses-permission android:name="android.permission.INTERNET" /> 第三步 编写请求数据代码 URL可以自己填写 在JsonObjectRequest中的onResponse,它的参数respo 阅读详情

RecyclerView

1.    为什么叫RecyclerView?

1.    不关心Item是否显示在正确的位置,如何显示。

2.    不关心Item之间如何分隔

3.    不关注Item的增加与删除的动画效果

4.    仅仅关注如何回收与复用View

2.    需要引入的类

LayoutManage确定显示的位置

1.    ItemDecoration设置Item之间的分隔

2.    ItemAnimation设置动画

3.    Adapter适配器

4.    ViewHolder复用

3.    RecyclerView能做什么

1.    Just likeListView

2.    Just likeGridView

3.    横向ListView

4.    横向GridView

5.    瀑布流

6.    定制Item增加与删除动画

1.    前五个对应的是LayoutManage

2.    最后一个对应的是ItemAnimotion

1.    传统的BaseAdapter会在getView中去进行创建ViewHolder和对应的View进行赋值,而在该Adapter中,将这个过程分成两部分。

2.    RecyclerView的Adapter的创建

1.    创建一个类,继承自RecyclerView.ViewHolder

class MyViewHolder extends RecyclerView.ViewHolder {
    TextView tv;

    public MyViewHolder(View itemView) {
        super(itemView);
        tv = ((TextView) itemView.findViewById(R.id.id_tv));
    }
}
1.  public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
    private LayoutInflater inflater;
    private Context context;
    private List<String> datas;

     MyAdapter(Context context, List<String> datas) {
        this.context = context;
        this.datas = datas;
        inflater = LayoutInflater.from(context);

    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.item1, parent, false);
        MyViewHolder viewHolder = new MyViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
             holder.tv.setText(datas.get(position));
    }

    @Override
    public int getItemCount() {
        return datas.size();
    }
}
1.  MainActivity中的代码和ListView一样。
2.  分隔线分为两种
1.  使用布局的background来充当分隔线
2.  借助DividerItemDecoration类
3.  package com.example.jash.recyclerview;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;

public class DividerItemDecoration extends RecyclerView.ItemDecoration
{

   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 DividerItemDecoration(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)
   {
//    Log.v("recyclerview - itemdecoration", "onDraw()");
       if (mOrientation == VERTICAL_LIST) {
               drawVertical(c, parent);
           } else {
               drawHorizontal(c, 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);
         RecyclerView v = new 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);
      }
   }

   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);
      }
   }
}
4.  设置RecyclerView的分隔线
        recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
5.  设置动画
 recyclerView.setItemAnimator(new DefaultItemAnimator())
      
1.  添加与删除
在Adapter中添加方法:
public void addData(int position) {
    datas.add(position,"Insert One");
    notifyItemInserted(position);
}

public void delData(int position) {
    datas.remove(position);
    notifyItemRemoved(position);
}
注意此时的Adapter的刷新!添加notifyItemInserted
删除:notifyItemRemoved
2.  点击事件
在Adapter中定义一个接口:
public interface OnItemClickListener {
    void OnItemClick(View view, int position);

    void OnItemLongClick(View view, int posution);
}

private OnItemClickListener listener;

public void setOnItemClickListeren(OnItemClickListener listeren) {
    this.listener = listeren;
}
 
3.  在onBindViewHolder方法中使用:
4.   if (listener != null) {
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            int layoutPosition = holder.getLayoutPosition();
            listener.OnItemClick(holder.itemView, layoutPosition);

        }
    });
}
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
    @Override
    public boolean onLongClick(View view) {
        int layoutPosition = holder.getLayoutPosition();
        listener.OnItemLongClick(holder.itemView, layoutPosition);
        return true;
    }
});
5.   注意:
int layoutPosition = holder.getLayoutPosition();
listener.OnItemClick(holder.itemView, layoutPosition);
6.   listener.OnItemClick(holder.itemView, layoutPosition);
layoutPosition 再点击Item的时候为真是的position
如果使用position则为开始我id,即……在position=1的地方添加一条,使用position,点击添加的Item id=1 无论添加多少条,id总为1
如果使用holder.getLayoutPosition ,添加的Item,点击Item之后获取到的Id为真的的id。
 
 
7.  RecyclerView的布局设置:
Just like ListView(垂直方向)
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
Just like ListView(水平方向)
 
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
Just like GridView(三列)
recyclerView.setLayoutManager((new GridLayoutManager(this, 3)));
水平GradView(五行)
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.HORIZONTAL));
 
8.  瀑布流的设置
1.  只需要在Adapter中动态的设置Holder.ItemView的高度。
9.  mHeight = new ArrayList<>();
for (int i = 0; i < mDatas.size(); i++) {
    mHeight.add((int) (100 + Math.random() * 300));
}
10. onBindViewHolder方法中
 ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
lp.height = mHeight.get(position);
holder.itemView.setLayoutParams(lp);
此时可以实现瀑布流的效果。
 
 
 

RecyclerView系列:RecyclerView嵌套RecyclerView(BaseRecyclerViewAdapterHelper实现) 看效果图: 先导入依赖包: 导入BaseRecyclerViewAdapterHelper和RecyclerView 把RecyclerView整到布局activity_main.xml中去。 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.and 阅读详情

相关推荐

Android——RecyclerView使用汇总

前言 众所周知,RecyclerView是一个功能强大的,用于替代ListView的控件。话虽如此,我在项目中的大多数情况下仍只是将其当做一个加强版的ListView使用,很少有深入使用其高级的功能,不过随着需求的增加,深入学习RecyclerView的高级功能也是必不可少的,因此,谨以此文记录我所见所闻的RecyclerView,方便日后复习查阅。 基础 基础使用 RecyclerView可以说是开发中的常客,相信大部分开发者都能轻松地完成基本使用下的代码,甚至由于经常使用而形成了肌肉记忆,实际上Recy

weixin_44139159的博客 1063

获取json数据显示RecyclerView

RecyclerView是一个比Listview强大的组件,RecyclerView显示数据时可横竖向,RecyclerView提供了3中显示效果样式LinearLayoutManager线性布局效果,GridLayoutManager(网格布局效果)和StaggeredGridLayoutManager(瀑布流布局效果). 效果图:            json数据:

Dianliang的博客 5775

如何使用RecyclerView

RecyclerView 总结

whale_kyle的博客 2733

Android实现RecyclerView显示json数据并点击跳转页面

准备工作,json数据的解析看一下上一篇帖子 第一步:在主页面引入控件,此处的布局使用ScrollView <android.support.v7.widget.RecyclerView android:id="@+id/recy" android:layout_width="match_parent" android:layout_height="match_parent" /> 第二步:

程序猿大波的博客 736

Recyclerview+json+图片展示+上下拉取刷新

Recyclerview+json+图片展示+上下拉取刷新,这是一个完整的demo,没有签名过的,使用及转载请标明来源,谢谢!!!

库卡机器人外部轴配置全流程:从接线到WorkVisual 6.0实战(附避坑指南)

本文详细解析了库卡机器人外部轴配置的全流程,涵盖从硬件接线到WorkVisual 6.0软件配置的实战步骤。重点介绍了KPP驱动模块连接、电机参数匹配、安全配置激活及零点标定等关键环节,并提供了实用的避坑指南,旨在帮助工程师高效、安全地完成外部轴集成,提升工作站柔性。

weixin_29161785的博客 504

Android动态获取json解析后显示到RecyclerView

首先,需要进行获取以及解析的json数据; { "code": "200", "tips": "ok", "message": "success", "devices": [ { "deviceid": 1, "userid": 3, "username&

Aftery的博客 4695

数学建模传染病模型_【数学建模】之传染病模型

点击【拇指笔记】,关注我的公众号。SE模型缺点:没有考虑接触到的人中还有一部分病人,所以所有人并不会全部被感染。建立模型:已感染人数(病人)每个病人每天有效接触(足以使人致病)人数为根据(1)(2)可以建立模型:等式两边同时除以\Delta t由导数定义有同时,取\Delta t = 1天由(1)(5)两式可得最终的模型:Logistic模型缺点:区分已感染者(病人)和未感染者(健康人)...

weixin_39590453的博客 2228

简单的RecyclerView嵌套RecyclerView实现购物车效果

今天趁着有空,记录一下在程序中利用RecyclerView嵌套RecyclerView实现的一个购物车功能。 效果如图 勾选与取消勾选都做了相关处理。 首先是首页的布局文件 xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/re

zpswz的博客 2581

步进电机原理及梯形加速算法

步进电机重理解与梯形加速算法

weixin_39912966的博客 1324

C++语言程序设计教程第4版杨进才沈显君课后习题答案解析

为了更好地学习这门课程,我尝试在网上寻找一些学习资料和参考书籍,但效果并不是很理想。因此,我希望能有一些学长学姐或者是有经验的程序员能够分享一些学习经验和方法,让我更好地掌握这门课程。学习过程中,我发现这本书的内容非常丰富,讲解也非常详细,对于像我这样编程基础薄弱的学生来说,是一本非常实用的教材。同时,我也希望有经验的程序员能够推荐一些适合初学者的C++语言学习资料和工具,以便我能更好地学习和掌握这门课程。总之,希望能得到大家的帮助和支持,让我更好地学习和掌握C++语言程序设计。主 编: 杨进才,沈显君。

weixin_58833001的博客 1334

RecyclerView(二)—— RecyclerView的使用

RecyclerView ListView由于强大的功能,在过去的Android开发当中可以说是贡献卓越,直到今天仍然还有不计其数的程序在使用ListView。不过ListView并不是完美无缺的,比如如果不使用一些技巧来提升它的运行效率,那么ListView的性能就会非常差。还有,ListView的扩展性也不够好, 它只能实现数据纵向滚动的效果,如果我们想实现横向滚动的话,ListView是做不到的。 为此,Android提供了一个更强大的滚动控件——RecyclerView。它可以说是一个增强版的Lis

xingyu19911016的博客 1938

【k8s故障处理篇】calico-kube-controllers状态为“ImagePullBackOff”解决办法

【k8s故障处理篇】calico-kube-controllers状态为“ImagePullBackOff”解决办法

jks212454的博客 2308

RecyclerView如何嵌套RecyclerView

Linearlayoutmanager RecyclerView嵌套GridLayoutManager RecyclerView 布局方式:以一个GridLayoutManager的recyclerview作为Linearlayoutmanager RecyclerView的itemview MainRecyclerAdapter.java public class MainRecyclerAdapter extends RecyclerView.Adapter<MainRecyclerAdap

Jonly_W的博客 2845

【Arduino 动手做】六舵机自平衡 Rotary Stewart 平台

《Arduino六舵机自平衡Rotary Stewart平台项目》 该项目展示了一个基于Arduino的六自由度Rotary Stewart平台,通过六个舵机实现动态平衡控制。设计采用激光切割框架和TAMIYA 70171套件,提供详细组装指南和开源固件(GitHub可获取)。开发者丹·罗耶分享了3D打印文件、视频演示及运动学优化需求,强调该平台可扩展应用于游戏控制(如Kerbal Space Program)或教育领域。项目链接包含完整资源包,鼓励用户参与改进并分享创作成果。该案例体现了Arduino在机

雕爷学编程 1094

YOLOv8的二次创新 | 结合iRMB与EMA打造全新的iEMA机制,提升动态检测性能【附保姆级代码】

YOLOv8继承了YOLO系列的轻量化和高效检测特性,同时通过改进的架构设计使得其在实时场景下具有更高的检测精度。然而,随着检测需求的增加,尤其是在动态目标检测和长时间序列检测中,YOLOv8的鲁棒性依然可以提升。通过iEMA机制的引入,我们将在这些方面进行进一步优化。iRMB模块是我们对传统Residual Block的进一步改进。通过多层特征提取,iRMB能够捕捉更多层次的特征信息,并通过引入轻量化的残差结构,提升计算效率。

一键难忘的博客 3087

Recyclerview 嵌套Recyclerview

一  首先写主Recycler的逻辑:  (这里用的是BaseFragment ,大家可以忽视里面的一些重载方法 ,直接在onCreateView里面写) public class FavouriteFragment extends BaseFragment { @BindView(recyclerview) RecyclerView mRecyclerv

凯文欧巴的IT全攻略 635

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?

微信电脑版本不会自动下载图片吗?——没有找到解决方法。——只会默认下载doc等文件,图片不行,需要自己另存为——有什么办法解决吗?此外,用户还可以选择将接收到的图片、视频和文件保存到指定的文件夹中。‌用户可以在微信设置中调整这一设置。

qq_15963745的博客 5095

Android中RecyclerView嵌套RecyclerView

前言这两天在做一个新的APP,在考虑用户体验上要一个两级的列表嵌套,于就想看看RecyclerView是否能做出这样的效果,自己写了一个DEMO来做一下测试,最后的效果还是比较满意的。下...

Vaccae的博客 1696

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

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

RecyclerView嵌套RecyclerView,内层RecyclerView区域无法响应Item点击

问题描述 项目中遇到了一个RecyclerView内嵌套RecyclerView,内层RecyclerView的区域无法响应所在Item的点击事件的问题(就是点击外层不能触发所在条目的点击事件)。 解决方式(形式不同,原理相同) 方式一 viewHolder.rv.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent ev.

Android格调小窝 2240

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

RecyclerView系列 - RecyclerView的基本使用

前言 RecyclerView 在本文发布之前,已经出来很久了,之前也有很多关于 RecyclerView 的优秀文章,那我为什么还要在这里写下本文呢,实不相瞒,我是 ListView 的忠实粉,之前很少使用到 RecyclerView,最近发现了不少关于 RecyclerView 的优秀框架,于是开始使用 RecyclerView,在使用第三方优秀框架的同时,也需要了解框架背后对组件进行的处理及...

一个IT人的技术成长历程。 4218

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

RecyclerView基本使用

RecyclerView是android 5.0推出的新的控件,官方给出的说明是: RecyclerView is a more advanced and flexible version of ListView. This widget is a container for large sets of views that can be recycled and scrolled ve

大写的Z 2503

android recyclerview,AndroidRecyclerView中的Item嵌套RecyclerView使用实例

最近项目中有一个需求是RecyclerView中的Item中嵌套RecyclerView,在网上没找到什么资料,然后就自己尝试了一下。首先看一下效果图录制GIF现在不大方便,就直接上两个图了。关于RecyclerView,都已经很熟悉了不熟悉的去百度一下,这里就不多介绍了。先说一下需求,最外层的是一个RecyclerView是竖向的,然后外层RecyclerView里面Item中的Recycler...

weixin_35651070的博客 1200
上一篇: 微信消息提醒与消息数字提示之BadgeView
下一篇: RecyclerView多布局的简单使用
JSON_ZJS
博客等级 码龄9年 30粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值