RecyclerView从Android 5.0开始引入,用以替代ListView、GridView控件,RecyclerView的存在,使得控件的耦合度更低,在ListView中需要使用ViewHolder做优化,而在RecyclerView里面自带了ViewHolder那么这篇文章就来写一写关于RecyclerView的基本使用,后面还会有文章继续对RecyclerView的使用做介绍

使用RecyclerView的准备

RecyclerView存在于support-v7中,这是为了更好的兼容各个版本,这这里说明以下V4,v7等包的作用,在系统中的很多控件在这个包里面都能找到,其主要作用就是各个不同系统版本的兼容,说简单一点就是为了在不同Android系统版本上有着相同的体验

在使用RecyclerView之前,需要导入依赖

在Android Studio中,直接在gradle中添加

implementation'com.android.support:recyclerview-v7:25.4.0'

注:这里注意两点,3.0以前的ide使用的是complie而3.0以后的ide使用的是implementation,还有一个地方是25.4.0,这里指的是编译版本,要和上面的compileSdkVersion相一致,比如compileSdkVersion 25那么这里应该是25.x.x,后面是小版本号,在SDK下载的地方可以看到

依赖导入完成,那么就可以开始使用RecycleView,其使用过程和ListView极其类似

数据准备

这里是模拟使用,就直接使用一个数据工具来生成数据,根据输入的个数返回数据

public class DataUtils {
public static List<String> initData(int num){
List<String> list = new ArrayList<>();
for (int i = 0; i < num; i++) {
list.add("item " + i);
}
return list;
}
}

适配器准备

和ListView一样,使用RecyclerView也需要准备适配器,不过在实现上稍有不同,RecyclerView的适配器是其内部类,需要实现onCreateViewHolder,onBindViewHolder,getItemCount三个方法

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {

    private List<String> list;

    class MyViewHolder extends RecyclerView.ViewHolder {
private TextView textView; public MyViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(android.R.id.text1);
}
} public MyRecyclerViewAdapter(List<String> list) {
this.list = list;
} @Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(android.R.layout.simple_list_item_1,parent,false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
} @Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.textView.setText(list.get(position));
} @Override
public int getItemCount() {
return list.size();
}
}

网格布局

网格布局直接使用以上数据和适配器即可

public class GridActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private MyRecyclerViewAdapter adapter;
private List<String> list; @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_grid);
recyclerView = (RecyclerView) findViewById(R.id.grid_recyclerview);
list = DataUtils.initData(100);
adapter = new MyRecyclerViewAdapter(list);
//设置样式,后面的参数代表设置三列
recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
recyclerView.setAdapter(adapter);
}
}

线性布局

线性布局只是在设置样式的时候不同,其他地方和网格布局相同,这里可以实现水平布局,这是ListView做不到的,可以是正序,也可以是反序

public class LineActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
private MyRecyclerViewAdapter adapter;
private List<String> list;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_line);
recyclerView = (RecyclerView) findViewById(R.id.line_recyclerview);
list = DataUtils.initData(100);
adapter = new MyRecyclerViewAdapter(list);
//设置样式,默认垂直
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//水平布局
//recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true));
recyclerView.setAdapter(adapter);
}
}

瀑布流

在使用瀑布流的时候会获取填充布局的宽高,这里使用一个随机数模拟,同时加上随机背景,方便查看

所以在这里需要修改适配器,使其达到想要的结果

public class StaggedAdapter extends RecyclerView.Adapter<StaggedAdapter.MyViewHolder> {
private List<String> list;
private List<Integer> height; class MyViewHolder extends RecyclerView.ViewHolder {
private TextView textView; public MyViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(android.R.id.text1);
}
} public StaggedAdapter(List<String> list) {
this.list = list;
height = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
//模拟瀑布流高度
int viewHeight = (int)Math.max(200,Math.random() *500);
height.add(viewHeight);
}
} @Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(android.R.layout.simple_list_item_1,parent,false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
} @Override
public void onBindViewHolder(MyViewHolder holder, int position) {
//设置背景颜色
ViewGroup.LayoutParams params = holder.textView.getLayoutParams();
params.height = height.get(position);
int color = Color.rgb(100, (int) (Math.random() * 255), (int) (Math.random() * 255));
holder.textView.setBackgroundColor(color);
holder.textView.setLayoutParams(params);
holder.textView.setText(list.get(position));
} @Override
public int getItemCount() {
return list.size();
}
}

其调用方法与前面的类似,这样便完成了瀑布流效果的实现

public class StaggedActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private StaggedAdapter adapter;
private List<String> list; @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_stagged);
recyclerView = (RecyclerView) findViewById(R.id.stagged_recyclerview);
list = DataUtils.initData(100);
adapter = new StaggedAdapter(list);
//设置样式
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, LinearLayoutManager.VERTICAL));
recyclerView.setAdapter(adapter);
}
}

以下是Demo的测试效果



源代码:链接:https://pan.baidu.com/s/1oEU5JyJLS5538GOZrFf1cQ 密码:95ip

给RecyclerView添加点击事件

在RecyclerView当中,是没有点击事件的,那么要实现点击,就需要自己去实现,这里就来实现一下RecycleView的点击监听

在适配器中添加点击方法和监听接口

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {

    private List<String> list;
private OnItemClickListener onItemClickListener; class MyViewHolder extends RecyclerView.ViewHolder {
private TextView textView; public MyViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(android.R.id.text1);
}
} public MyRecyclerViewAdapter(List<String> list) {
this.list = list;
} @Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(android.R.layout.simple_list_item_1,parent,false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
} @Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.textView.setText(list.get(position));
if (onItemClickListener != null) {
holder.textView.setOnClickListener(new MyClickLister(position));
}
} @Override
public int getItemCount() {
return list.size();
} public interface OnItemClickListener {
void onItemClick(View view, int position);
} public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
} class MyClickLister implements View.OnClickListener {
private int position; public MyClickLister(int position) {
this.position = position;
} @Override
public void onClick(View v) {
onItemClickListener.onItemClick(v, position);
}
}
}

在活动中设置监听

public class LineActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
private MyRecyclerViewAdapter adapter;
private List<String> list; @Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_line);
recyclerView = (RecyclerView) findViewById(R.id.line_recyclerview);
list = DataUtils.initData(100);
adapter = new MyRecyclerViewAdapter(list);
//设置点击监听
adapter.setOnItemClickListener(new MyRecyclerViewAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(LineActivity.this, "点击 " + position, Toast.LENGTH_SHORT).show();
}
});
//设置样式,默认垂直
recyclerView.setLayoutManager(new LinearLayoutManager(this));
//水平布局
recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true));
recyclerView.setAdapter(adapter);
}
}

测试效果如下



源代码:链接:https://pan.baidu.com/s/1FCHqwlRhdbpB-qcozkQXJA 密码:ls7y

相同的做法,还可以实现长按等监听

高级UI-RecyclerView简单使用的更多相关文章

  1. Android 高级UI设计笔记07:RecyclerView 的详解

    1. 使用RecyclerView       在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表.应用列表.消息列表等等,但是从Android 一出生到现在并没有非常 ...

  2. WeX5的简单介绍及UI的简单讲解

    WeX5的简单介绍及UI的简单讲解 (2016-01-13 14:49:05) 标签: it 分类: WeX5的初步自学 一.WeX5的简单讲解 1.WeX5是前端快速开发框架,可开发跨端运行应用.是 ...

  3. iOS开发UI篇—简单的浏览器查看程序

    iOS开发UI篇—简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 需要读取或修改属性的控件需要设置属性 序号标签 图片 图片描述 左边按钮 右边按钮 (2) 需要监听响应事件 ...

  4. iOS开发UI篇—简单介绍静态单元格的使用

    iOS开发UI篇—简单介绍静态单元格的使用 一.实现效果与说明 说明:观察上面的展示效果,可以发现整个界面是由一个tableview来展示的,上面的数据都是固定的,且几乎不会改变. 要完成上面的效果, ...

  5. firefox 扩展开发笔记(三):高级ui交互编程

    firefox 扩展开发笔记(三):高级ui交互编程 前言 前两篇链接 1:firefox 扩展开发笔记(一):jpm 使用实践以及调试 2:firefox 扩展开发笔记(二):进阶开发之移动设备模拟 ...

  6. 微信小程序初探【类微信UI聊天简单实现】

    微信小程序最近很火,火到什么程度,只要你一打开微信,就是它的身影,几乎你用的各个APP都可以在微信中找到它的复制版,另外官方自带的跳一跳更是将它推到了空前至高的位置.对比公众号,就我的感觉来说,有以下 ...

  7. iOS开发——高级UI之OC篇&UIdatePicker&UIPickerView简单使用

    UIdatePicker&UIPickerView简单使用 /***************************************************************** ...

  8. Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件

    1. 引言: RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一 ...

  9. Android 高级编程 RecyclerView 控件的使用

    RecyclerView 是Android 新添加的一个用来取代ListView的控件,它的灵活性与可替代性比listview更好. 看一下继承关系: ava.lang.Object    ↳ and ...

  10. iOS开发——高级UI&带你玩转UITableView

    带你玩装UITableView 在实际iOS开发中UITableView是使用最多,也是最重要的一个控件,如果你不会用它,那别说什么大神了,菜鸟都不如. 其实关于UItableView事非常简单的,实 ...

随机推荐

  1. P5541 [USACO19FEB]Sleepy Cow Herding

    ri,被黄题虐. 思路:贪心?? 提交:2次 错因:没有特判 题解: 先排序. 最小代价:固定区间长度为\(n\),我们扫一遍数组看区间最多包含几个数,设为 \(mx\) ,答案就是\(n-mx+1\ ...

  2. 发布VS源码

    发布VS源码步奏 先将Web.config设置修改一下   IP设置成点    文件名称设置成文件夹的名称,右键点击项目,点发布   勾选删除现有文件,点击发布 打开文件加  将文件解压成压缩包, 打 ...

  3. Mina整体体系结构分析

    mina在应用程序中处于什么样的地位? mina屏蔽了一些网络通信细节对socket进行封装,并且基于NIO非阻塞框架,可以帮助我们快速开发网络通信,常常用于用户游戏开发,中间件等服务端应用程序.

  4. 关于 requestAnimationFrame 小结

    一.小谈 requestAnimationFrame: 说起 requestAnimationFrame,我们先看幅图: 相当一部分的浏览器的显示频率是16.7ms, 就是上图第一行的节奏,表现就是“ ...

  5. TensorFlow(七):tensorboard网络执行

    # MNIST数据集 手写数字 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # ...

  6. P1021 邮票面值设计——搜索+完全背包

    P1021 邮票面值设计 题目意思是你最多用n张邮票,你可以自己设定k种邮票的面值,每种邮票数量无穷,你最多能用这k种邮票在不超过n张的情况下,组合成的价值要求是从1开始连续的, 求最大能连续到多少: ...

  7. vue组件的原理

    https://www.cnblogs.com/landeanfen/p/6518679.html

  8. iOS开发~防止navigation多次push一个页面

    在点击push下一个页面时,因为各种原因,点一下cell或按钮没有响应,用户可能就多点几下,这时候会打开好几个一样的页面. 这是因为push后的页面有耗时操作或者刚好push到另一个页面时,另一个页面 ...

  9. selinux 开启和关闭

    对于新手来说,linux的selinux困扰了一大批学员,开启后,导致文件权限修改不了等问题,下面就是关闭设置setlinux的方法 查看SELinux状态: 1./usr/sbin/sestatus ...

  10. What are the benefits to using anonymous functions instead of named functions for callbacks and parameters in JavaScript event code?

     What are the benefits to using anonymous functions instead of named functions for callbacks and par ...