RecyclerView的使用

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);}@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = inflater.inflate(R.layout.item1, parent, false);MyViewHolder viewHolder = new MyViewHolder(view);return viewHolder;}@Overridepublic void onBindViewHolder(final MyViewHolder holder, final int position) {holder.tv.setText(datas.get(position));}@Overridepublic 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;}@Overridepublic 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);}}@Overridepublic 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() {@Overridepublic void onClick(View view) {int layoutPosition = holder.getLayoutPosition();listener.OnItemClick(holder.itemView, layoutPosition);}});
}
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic 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);
此时可以实现瀑布流的效果。
 
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud 面试题

转载自 Spring Cloud 面试题 问题一&#xff1a; 什么是Spring Cloud&#xff1f; Spring cloud流应用程序启动器是基于Spring Boot的Spring集成应用程序&#xff0c;提供与外部系统的集成。Spring cloud Task&#xff0c;一个生命周期短暂的微服务框架&#xff0c;用于快…

第三章用sql语句操作数据

一、sql是什么&#xff1a; 1.结构化查询语言 2.在什么情况下使用&#xff1a; &#xff08;1&#xff09;对sqlserver执行所有操作的时候 &#xff08;2&#xff09;对程序进行增删改查的时候 3.sql组成&#xff1a; &#xff08;1&#xff09;DML数据操作语言&#xff0c;ins…

从真实项目中抠出来的设计模式——第二篇:过滤器模式

一&#xff1a;实际场景介绍 我们在给用户做订单催付通知的时候&#xff0c;会有这样的一种场景&#xff0c;用户在系统后台设置一组可以催付的规则&#xff0c;比如说订单金额大于xx元&#xff0c;非黑名单用户&#xff0c;来自 哪个地区&#xff0c;已购买过某个商品&#x…

2015蓝桥杯省赛---java---A---8(移动距离)

题目描述 思路分析 行号的差的绝对值列号的差的绝对值 代码实现 package lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {int w0,m0,n0;Scanner scanner new Scanner(System.in);wscanner.nextInt();mscanner.nextInt();…

RecyclerView多布局的简单使用

RecyclerView多布局的简单 RecyclerView 是在Android5.0之后推出的&#xff0c;是一个比ListView更加灵活更加高效的适配器类型控件。但是RecyclerView不同于其他类型的适配器&#xff0c;它还需要一个LayoutManager进行页面控制展示。RecyclerView提供了三种布局管理器&#x…

Spring Boot 面试题

转载自 Spring Boot 面试题 问题一 什么是Spring Boot&#xff1f; 多年来&#xff0c;随着新功能的增加&#xff0c;spring变得越来越复杂。只需访问https://spring.io/projects页面&#xff0c;我们就会看到可以在我们的应用程序中使用的所有Spring项目的不同功能。如果必…

可以代表学计算机的标志,桌面上的图标可以用来表示

语音内容&#xff1a;大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。以计算机为例&#xff0c;桌面上的图标可以用来表示文件、文件夹或快捷方式。“计算机”一般是指“电子计算机”&#xff0c;电子计算机(electronic computer)通…

第四章数据查询基础

第四章数据查询基础 一、查询流程&#xff1a; 1.客户端–》请求一条查询语句–》数据库–》返回查询结果 二、导出数据库脚本&#xff1a; 1.选中数据库–》右击–》任务–》生成脚本–》下一步–》选择存放路径–》高级–》选择架构和数据–》下一步–》确定。 三、查询的语法…

Visual Studio 2017迎来F# 4.1

三月初发布的Visual Studio 2017&#xff0c;包含了F# 4.1和Visual F#工具的更新。F# 4.1带来了语言层面提升以及与C# 7的互操作能力&#xff0c;而那些Visual F#工具是支持Roslyn workspaces的首个版本。 正如上文提到的&#xff0c;F# 4.1带来了语言层面提升以及与C# 7的互操…

Spring 事务原理和使用

转载自 Spring 事务原理和使用 1.SpringTransactional的配置 步骤一、在Spring配置文件中引入命名空间 <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:tx"http://www…

第五章模糊查询和聚合函数

第五章模糊查询和聚合函数 一、模糊查询&#xff1a; 1.关键词&#xff1a;like 2._代表&#xff1a;一个字符&#xff0c;eg:like ‘c’&#xff0c;查询的结果是三个字&#xff0c;中间必须是c 3.%代表&#xff1a;多个字符&#xff0c;eg:like ‘%张’,查询的结果是张结尾的…

Android模拟器之神奇Genymotion的安装

Android模拟器之神奇Genymotion的安装 经常有人问我&#xff0c;Android开发不适用真机的情况下&#xff0c;用什么模拟器比较好用&#xff01;我这里推荐两款&#xff0c;一个是前两年开发时使用的“夜神模拟器”&#xff0c;这个在这就不多说了&#xff01;直接下载安装就可以…

微软在.NET官网上线.NET 架构指南频道

微软在Visual Studio 2017 正式发布的时候也上线了一个参考应用https://github.com/dotnet/eShopOnContainers , 最近微软给这个参考应用写了完善的文档&#xff0c;放在.NET官网的.NET架构频道https://www.microsoft.com/net/architecture。 整个.NET 架构按照4个部分展开&am…

2015蓝桥杯省赛---java---B---10(生命之树)

题目描述 思路分析 dfs无根树变有根树 代码实现 package lanqiao;import java.util.Scanner;public class Main {//提升作用域public static int n;public static int[] w;//每个点的权重public static int[] ww;//每个点作为根节点时能得到的最大权和public static int[][…

第六章连接和分组查询

第六章连接和分组查询 一、分组查询&#xff1a; 1.语法&#xff1a;select 列名 from 表名 where 条件 group by 分组的列 order by 列名 排序方式&#xff08;asc/desc&#xff09; 2.多列分组的语法&#xff1a; select 列名1,列名2 from 表名 where 条件 group by 分组的列…

wps工资表怎么用计算机,wps制作工资表的方法步骤图

wps是一款强大的日常办公软件&#xff0c;我们可以使用wps来制作工资表&#xff0c;想知道具体的操作吗?下面就让学习啦小编告诉你wps如何制作工资表&#xff0c;希望对大家有所帮助。wps制作工资表的方法第一节 建立与使用 WPS表格WPS Office 2007办公 软件中提供了一个名为 …

Java8面试题

转载自 Java8面试题 问题一&#xff1a; Java8支持函数编程是什么意思&#xff1f; 在Java 8之前&#xff0c;所有东西都是面向对象的。除了原语之外&#xff0c;java中的 所有内容都作为对象存在。对方法/函数的所有调用都是使用对象或类引用进行的。 方法/功能本身并不…

Linux中打包和解压到的方法

打包aa为ab.tar.gz tar zcvf ab.tar.gz aa 即可 如果要解压到当前位置 tar zxvf ab.tar.gz 但是如果要解压到其它位置,命令有点不一样的地方,如像要解压到另外的目录,如cc tar zxvf ab.tar.gz -C cc   或者写全路径也行tar zxvf ab.tar.gz -C /home/cc 这样就把这个包的内…

为什么转换到Visual Studio 2017如此 “容易”

与VS 2015相比&#xff0c;Visual Studio 2017在C 功能方面有重大的飞跃。我们希望升级到新版本后能让您的日常工作变得更轻松。 这篇文章主要介绍从Visual Studio 2015升级到2017的步骤。在这个版本中&#xff0c;我们团队使代码库移动到Visual Studio 2017非常容易。这里有四…