RecyclerView多布局的简单使用

RecyclerView多布局的简单

   RecyclerView 是在Android5.0之后推出的,是一个比ListView更加灵活更加高效的适配器类型控件。但是RecyclerView不同于其他类型的适配器,它还需要一个LayoutManager进行页面控制展示。RecyclerView提供了三种布局管理器:
  1、LinearLayoutManager:线性布局管理器,支持水平和垂直效果。
  2、GridLayoutManager:网格布局管理器,支持水平和垂直效果。
  3、StaggeredGridLayoutManager:分布型管理器,瀑布流效果

RecyclerView的使用:
  1、引入RecyclerView依赖包,V7下的,兼容到API17.
  2、在xml布局中声明,在Java代码中初始化。
  3、设置布局管理器
  4、创建适配器,设置数据源,绑定适配器
    具体创建适配器:①创建一个类,继承RecyclerView.Adapter<ViewHolder>.
            ②创建一个类ViewHolder,继承RecyclerView。VIewHolder,该类需要创建一个匹配父类的构造。
            ③重写适配器中的方法:getItemCount():获取数据源的个数(item的数量);onCreateViewHolder():该方法中导入布局,实例化VIewHolder;onBindViewHolder():绑定VIewHolder,加载数据。

注意一点:RecyclerView的LinearLayoutManager不同于一般的适配器的布局,RecyclerView的item最外层的布局参数是有效的,如高度宽度等,所以在使用的时候,第一种方法是在导入View的时候指定没有parent(不推荐使用),第二种方法是在item布局的最外层指定具体的参数。
RecyclerView 为开发者提供了强大的复用机制,但是所有的点击事件都丢了,没有提供默认的点击事件,所以需要我们自己为RecyclerView手动实现点击。

 

多布局在JSON文件中一般有明确的区分,例如通过Type=1,2,3,4,等方式进行区分,Type=1,说明是一种类型的布局!

RecyclerView的使用场景:

多种样式的列表。

宫格和列表同时存在

分类列表(比如通讯录)

多布局的重点:

1、       复写getItemViewType(int position)

根据各个position的位置,返回不同的类型。

2、       处理getItemCount

3、       按照返回的类型处理onCreateViewHolder和onBindViewHolder方法

RecyclerView多种布局原理和机制::

     多种布局保存!

RV中的关键成员:

     Type <-   getItemViewType(int position)

     RecyclerView.Holder

     RecyclerView.Recycler

Recycler中保存了一些缓存机制(类上与ListView中的conVertView)

多布局的设计流程

滚动 ----àgetItemViewType(position)------à根据Type寻找Holder-------àif(寻找Holder时返回null)-----àadpter.createViewHolder-----à否则adapter.bindViewHolder.

getItemViewType

     ItemType保存在Holder中

     Holder根据position被缓存在cache中

     遍历缓存中的Holder,如果Type一致就返回。

当我们需要重复使用的时候,系统会在cache里面拿holder,进而实现使用流畅。

和ListView的区别

1.   type已经是Holder的成员

2.   RecyclerView的缓存单位是Holder而不在是View

3.   RecyclerPool的缓存key是type

getItemViewtype(intposition)中的Type,只需要一个数字,不一定是连续的数字。

 

    

     代码实现以及说明:

导入compile 'com.android.support:recyclerview-v7:26.+'

RecyclerView的依赖

DataModle:

   package com.example.jash.recyclerview_more;import java.io.Serializable;
public class DataModel implements Serializable {public static final int TYPE_ONE = 1;public static final int TYPE_TWO = 2;public static final int TYPE_THREE = 3;public int type;public int avatarColor;public String name;public String Content;public int contentColor;
}
 
三个布局的XML:
First:
<?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="60dp"android:gravity="center"android:orientation="horizontal"><ImageViewandroid:id="@+id/avatar"android:layout_width="40dp"android:layout_height="40dp"android:layout_marginLeft="20dp" /><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"tools:text="aaaaa" />
</LinearLayout>
Two:
<?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="60dp"android:gravity="center"android:orientation="horizontal"><ImageViewandroid:id="@+id/zuozhe"android:layout_width="40dp"android:layout_height="40dp"android:layout_marginLeft="20dp" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"tools:text="aaaaa" /><TextViewandroid:id="@+id/content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:layout_marginTop="10dp"tools:text="aaaaa" /></LinearLayout>
</LinearLayout>
Three:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="60dp"><ImageViewandroid:layout_alignParentLeft="true"android:id="@+id/avatar"android:layout_width="40dp"android:layout_height="40dp"android:layout_centerVertical="true" /><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_toRightOf="@+id/avatar"android:orientation="vertical"><TextViewandroid:id="@+id/name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"tools:text="aaaaa" /><TextViewandroid:id="@+id/content"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:layout_marginTop="10dp"tools:text="aaaaa" /></LinearLayout><ImageViewandroid:id="@+id/contentImage"android:layout_width="60dp"android:layout_height="60dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"/>
</RelativeLayout>
    抽象ViewHolder
import android.support.v7.widget.RecyclerView;
import android.view.View;
public abstract class TypeAbstrHolder extends RecyclerView.ViewHolder {public TypeAbstrHolder(View itemView) {super(itemView);}public abstract void bindHolder(DataModel model);
}
三个ViewHolder 继承抽象ViewHolder
First:
import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class TypeOneViewHolder extends TypeAbstrHolder {public ImageView avatar;public TextView name;public TypeOneViewHolder(View itemView) {super(itemView);avatar = (ImageView) itemView.findViewById(R.id.avatar);name = (TextView) itemView.findViewById(R.id.name);itemView.setBackgroundColor(Color.GREEN);}@Overridepublic void bindHolder(DataModel model) {avatar.setBackgroundResource(model.avatarColor);name.setText(model.name);}}
Two:
import android.content.Context;
import android.graphics.Color;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class TypeTwoHolder extends TypeAbstrHolder {private ImageView zuozhe;private TextView name;private TextView content;public TypeTwoHolder(View itemView) {super(itemView);zuozhe = (ImageView) itemView.findViewById(R.id.zuozhe);name = (TextView) itemView.findViewById(R.id.name);content = (TextView) itemView.findViewById(R.id.content);itemView.setBackgroundColor(Color.BLACK);}@Overridepublic void bindHolder(DataModel model) {zuozhe.setBackgroundResource(model.avatarColor);name.setText(model.name);content.setText(model.Content);}
}
three:
import android.graphics.Color;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class TypeThreeViewHolder extends TypeAbstrHolder {private ImageView avatar;private TextView name;private TextView content;private ImageView contentColor;public TypeThreeViewHolder(View itemView) {super(itemView);avatar = (ImageView) itemView.findViewById(R.id.avatar);name = (TextView) itemView.findViewById(R.id.name);content = (TextView) itemView.findViewById(R.id.content);contentColor = (ImageView) itemView.findViewById(R.id.contentImage);itemView.setBackgroundColor(Color.GRAY);}@Overridepublic void bindHolder(DataModel model) {avatar.setImageResource(model.avatarColor);name.setText(model.name);content.setText(model.Content);contentColor.setBackgroundResource(model.contentColor);}
}
RecyclerView的Adapter
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.ViewGroup;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private Context context;private List<DataModel> mList = new ArrayList<>();private LayoutInflater inflater;protected MyAdapter(Context context) {this.context = context;inflater = LayoutInflater.from(context);}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {switch (viewType) {case DataModel.TYPE_ONE:return new TypeOneViewHolder(inflater.inflate(R.layout.one, parent, false));case DataModel.TYPE_TWO:return new TypeTwoHolder(inflater.inflate(R.layout.two, parent, false));case DataModel.TYPE_THREE:return new TypeThreeViewHolder(inflater.inflate(R.layout.three, parent, false));}return null;}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {((TypeAbstrHolder) holder).bindHolder(mList.get(position));}@Overridepublic int getItemViewType(int position) {return mList.get(position).type;}@Overridepublic int getItemCount() {return mList.size();}public void addList(List<DataModel> list) {mList.addAll(list);}
}
MainActivity:
package com.example.jash.recyclerview_more;import android.graphics.Rect;
import android.support.v4.view.GravityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class MainActivity extends AppCompatActivity {private RecyclerView mRecycler;private MyAdapter mAdapter;int color[] = {android.R.color.holo_orange_dark,android.R.color.holo_red_dark,android.R.color.holo_blue_bright};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mRecycler = (RecyclerView) findViewById(R.id.recycler);
        mRecycler.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));mAdapter = new MyAdapter(this);mRecycler.setAdapter(mAdapter);initData();}private void initData() {List<DataModel> list = new ArrayList<>();for (int i = 0; i < 30; i++) {int type;if (i < 5 || (i > 15 && i < 20)) {type = 1;} else if (i < 10 || i > 26) {type = 2;} else {type = 3;}Log.d("1", "initData: " + String.valueOf(type) + "=====>>>" + i);DataModel data = new DataModel();data.avatarColor = color[type - 1];data.type = type;data.name = "name" + i;data.Content = "conten" + type;data.contentColor = color[type - 1];list.add(data);}mAdapter.addList(list);}
}
mainXML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"tools:context="com.example.jash.recyclerview_more.MainActivity"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recycler"android:layout_width="match_parent"android:layout_height="match_parent" />
</RelativeLayout>
实现的布局!
为列表类的还有三种不同的布局的显示
          
二、如何实现GridView和ListView同时显示!
    MainActivity中:加入代码
final GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3);创建一个3列显示的GridView。 
        Log.d("1", "onCreate: " + gridLayoutManager.getSpanCount());
该方法为合并GridView中的列
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {@Overridepublic int getSpanSize(int position) {
//获取指定position上的itemView的typeint type = mRecycler.getAdapter().getItemViewType(position);
//如果type==类型为3 的布局 if (type == DataModel.TYPE_THREE) {
//获取gridLayoutManager的列数,上面指定为3了,所有将3 合并成1,否则不合并return gridLayoutManager.getSpanCount();} else {return 1;}}});
//添加分隔线!mRecycler.addItemDecoration(new RecyclerView.ItemDecoration() {@Overridepublic void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) view.getLayoutParams();
//获取一行中含有多少个 Viewint spanSize = layoutParams.getSpanSize();
// spanIndex ==1   为View的左侧  ==2  为View的右侧int spanIndex = layoutParams.getSpanIndex();outRect.top = 20;if (spanSize != gridLayoutManager.getSpanCount()) {outRect.left=3;
                }
//切记一定要注释掉这行代码!
//                super.getItemOffsets(outRect, view, parent, state);
            }});
 
效果图:

             

 

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

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

相关文章

Spring Boot 面试题

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

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…

微软在.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[][…

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

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

Java8面试题

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

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

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

2015蓝桥杯省赛---java---A---9(垒筛子)

题目描述 思路分析 递归 会超时 通过30% 代码实现 package lanqiao;import java.util.Scanner;public class Main {public static int op[]new int[7];public static int n,m;public static boolean conflict[][]new boolean[7][7];public static int MOD1000000007;publi…

想进入谷歌吗?先来看看这些面试题吧

转载自 想进入谷歌吗&#xff1f;先来看看这些面试题吧 谷歌&#xff0c;美国的跨国科技企业&#xff0c;致力于互联网搜索、云计算、广告技术等领域&#xff0c;开发并提供大量基于互联网的产品与服务。2016年6月8日&#xff0c;《2016年BrandZ全球最具价值品牌百强榜》公布…

计算机沙盒应用,既能防木马病毒又能多开应用,这款软件Windows不能没有

各位差友平时在 Windows 电脑上是怎么下载软件的呢&#xff1f;世超猜测很多人会选择在浏览器里直接搜索某个软件的名字&#xff0c;搜索结果中出现官网就从官网下载&#xff0c;没有官网就进到各种资源聚合网站碰碰运气。而众所周知&#xff0c;Windows 平台向来不缺各种流氓软…

从真实项目中抠出来的设计模式——第三篇:责任链模式

一&#xff1a;现实场景 有时候在开发的过程中&#xff0c;我们经常会根据某个状态的值&#xff0c;写出很多的ifelse逻辑&#xff0c;比如拿项目里面的案例来说&#xff0c;如果当前发送的是彩信&#xff0c;此种状态需要如何给实体赋值&#xff0c;如果是短信&#xff0c;邮件…

Spark之Master主备切换机制原理

Spark之Master主备切换机制原理

SQL正在击败NoSQL,这对未来的数据意味着什么

转载自 SQL正在击败NoSQL&#xff0c;这对未来的数据意味着什么 经过多年的沉寂之后&#xff0c;今天的SQL正在复出。缘由如何&#xff1f; 这对数据社区有什么影响&#xff1f; 自从可以利用计算机做事以来&#xff0c;我们一直在收集的数据以指数级的速度在增长&#xff0…

公共计算机课程思政建设实施方案,公共计算机教研组开设课程思政公开课

为了进一步奠定课程思政基础,提高教师将思政元素融入到专业课程的能力,创造一个课程思政的良好氛围,2021年4月30日上午&#xff0c;公共计算机教研组陈雪云老师在文虎楼401教室开设《计算机文化基础(理)》思政课程公开课。授课班级是2020级数学师范1、2班。李美莲、黄婷、龚长斌…

数字奇数和偶数的判断

package lanqiao;/*** 创建人 wdl* 创建时间 2021/4/16* 描述*/ public class TEST {public static void main(String[] args) {int a7,b8;if((a&1)1){System.out.println("a是奇数");}if((b&1)0){System.out.println("b是偶数");}}}

asp.net core源码飘香:从Hosting开始

知识点&#xff1a; 1.Kestrel服务器启动并处理Http请求的过程。 2.Startup的作用。 源码飘香&#xff1a; 总结&#xff1a; asp.net core将web开发拆分为多个独立的组件&#xff0c;大多以http中间件的形式添加到请求管线&#xff0c;也有一下作为基础组件&#xff08;con…

这些Spring中的设计模式,你都知道吗?

转载自 这些Spring中的设计模式&#xff0c;你都知道吗&#xff1f; 设计模式作为工作学习中的枕边书&#xff0c;却时常处于勤说不用的尴尬境地&#xff0c;也不是我们时常忘记&#xff0c;只是一直没有记忆。 Spring作为业界的经典框架&#xff0c;无论是在架构设计方面&a…

如何移植.NET Framework项目至.NET Core?

公司的项目一直采用.NET框架来开发Web项目。目前基础类库均为.NET Framework 4.6.2版本。Caching, Logging&#xff0c;DependencyInjection&#xff0c;Configuration等基础设施相关的依赖库一直和官方保持同步&#xff0c;目前是1.1版本。.NET Core越来越趋于稳定&#xff0c…