Recycleview使用详情及添加点击事件
2017-09-05 18:33
477 查看
前言
记录一下自己自学Recycleview的过程吧,仅供新手入门学习。首先来说说我对Recycleview的看法吧,我对Recycleview和listview主要就是Recycleview显示类型,既可以是gridview,也可以使瀑布流式的显示,只需更改layoutmanager,非常方便,而具体的区别,网上也有很多人说了,有兴趣深入了解的也可以看一看文章最后的一篇文章, 他对Recycleview和listview做了充分的对比。
Recycleview的使用详情
Recycleview需要两个设置:布局设置 LayoutManager
适配器设置 Adapter
一、 布局设置 LayoutManager
LayoutManager只是一个抽象类而已,主要靠三个实体类来实现布局展示方式:LinearLayoutManager(线性布局效果)、GridLayoutManager(网格布局效果)、StaggeredGridLayoutManager(瀑布流布局效果)。
1. 使用LinearLayoutManager
创建LinearLayoutManager,然后以setOrientation()设置方向(如果不填写,默认纵向滚动),最后给recycleview添加layoutManagerLinearLayoutManager linearLayoutManager= new LinearLayoutManager(this); linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); //横向 //linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); //纵向 recyclerView.setLayoutManager(linearLayoutManager);
2. 使用GridLayoutManager
创建GridLayoutManager,第二个参数选择行数(或者列数),其他的和LinearLayoutManager一样GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2); gridLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(gridLayoutManager );
3. 使用StaggeredGridLayoutManager
创建StaggeredGridLayoutManager,第一个参数选择行数(或者列数),第二个参数选择方向,其他的和LinearLayoutManager一样StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL); recyclerView.setLayoutManager(staggeredGridLayoutManager );
如果你想禁止Recycleview的滑动事件,可以在layoutManager重写其中的canScrollVertically()方法,返回false即可,以LinearLayoutManager 为例:
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this){ @Override public boolean canScrollVertically() { return false; } };
二、 适配器设置 Adapter < ViewHolder >
1. 自定义viewholder
先简单的画一个xml布局<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
然后写一个adapter中,包括一个内部类MyViewHolder继承RecyclerView.ViewHolder,你可以在这个这里写控件的点击事件
public class DemoAdapter extends RecyclerView.Adapter<DemoAdapter.MyViewHolder> { public String[] text = null; //添加数据 public void setDate(String[] text) { this.text = text; notifyDataSetChanged(); } //创建布局 @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycleview,parent,false); return new MyViewHolder(view); } //绑定数据 @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.textview.setText(text[position]); } //获取条目数量 @Override public int getItemCount() { return text.length; } @Override public int getItemViewType(int position) { return super.getItemViewType(position); } class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView textview; public MyViewHolder(View itemView) { super(itemView); textview = (TextView) itemView.findViewById(R.id.textview); textview.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.textview: //你要写的点击图片的事件 break; } } } }
在MainActivity中设置adapter,在没有数据的情况下,
@Override public int getItemCount() { return text.length; }
方法返回值为0的时候,是不会调用onCreateViewHolder,和onBindViewHolder, 获取数据之后在将数据传到adapter中 adapter.setDate(text);`就OK了
三、 给Recycleview添加item点击事件
用接口回调的方式在adapter中添加private OnItemClickListener mOnItemClickListener = null; public interface OnItemClickListener { void onClick(View view, int position); }; public void setOnItemClickListener(OnItemClickListener listener) { this.mOnItemClickListener = listener; }
你还需要在onCreateViewHolder,onBindViewHolder,onClick中添加一下代码
//创建布局 @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycleview,parent,false); //设置view的点击事件 view.setOnClickListener(this); return new MyViewHolder(view); } //绑定数据 @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.textview.setText(text[position]); //给holder的itemview添加Tag为position holder.itemView.setTag(position); } @Override public void onClick(View v) { if (mOnItemClickListener != null) { //注意这里使用getTag方法获取position mOnItemClickListener.onClick(v,(int)v.getTag()); } }
Recycleview的整体代码
1. 使用前提
在gradle中添加依赖,例如我用的sdk版本是25,所以添加的是v7:25.3.1,在dependencies中添加下面一行代码`compile 'com.android.support:recyclerview-v7:25.3.1'`
2. 具体代码
xml中代码
xml中的方法和listview或其他控件基本一致<android.support.v7.widget.RecyclerView android:id="@+id/rv_demo" android:layout_width="match_parent" android:layout_height="match_parent"/>
条目xml布局代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/textview" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
Adapter中代码
public class DemoAdapter extends RecyclerView.Adapter<DemoAdapter.MyViewHolder> implements View.OnClickListener {
public String[] text = null;
//添加数据
public void setDate(String[] text) {
this.text = text;
notifyDataSetChanged();
}
//创建布局
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycleview,parent,fals
984e
e);
//设置view的点击事件
view.setOnClickListener(this);
return new MyViewHolder(view);
}
//绑定数据
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.textview.setText(text[position]);
//给holder的itemview添加Tag为position
holder.itemView.setTag(position);
}
//获取条目数量
@Override
public int getItemCount() {
return text.length;
}
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
//注意这里使用getTag方法获取position
mOnItemClickListener.onClick(v,(int)v.getTag());
}
}
class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView textview;
public MyViewHolder(View itemView) {
super(itemView);
textview = (TextView) itemView.findViewById(R.id.textview);
textview.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.textview:
//你要写的点击图片的事件
break;
}
}
}
private OnItemClickListener mOnItemClickListener = null; public interface OnItemClickListener { void onClick(View view, int position); }; public void setOnItemClickListener(OnItemClickListener listener) { this.mOnItemClickListener = listener; }}
MainActivity中代码
public class MainActivity extends AppCompatActivity { private String[] text = {"测试1","测试2","测试3"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rv_demo); //创建layoutManager LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); //给recyclerView设置layoutManager recyclerView.setLayoutManager(linearLayoutManager); //adapter DemoAdapter adapter = new DemoAdapter(); //给recyclerView设置adapter recyclerView.setAdapter(adapter); //添加数据 adapter.setDate(text); } }
以上就是Recycleview的简单使用,有什么错的请大家帮忙指正,以下是我在学习Recycleview的时候阅读的一些博文,还有写这篇的时候也有借鉴,就粘出来,有兴趣的可以去看看。
RecyclerView使用介绍
RecyclerView和ListView使用对比分析
相关文章推荐
- 富文本的使用之一 给TextView部分字段添加点击事件
- Android中Recyclerview使用6----添加条目得到点击事件和长按事件(另一种写法,较简单)
- Recycleview添加item点击事件
- RecyclerView使用详解一代替ListView(点击事件,添加头布局,上拉刷新下拉加载)
- RecycleView 添加item点击事件
- RecycleView添加头部、点击事件的监听
- Android中Recyclerview使用3----添加条目得到点击事件和长按事件
- RecycleView怎么添加点击事件
- Android RecyclerView的使用与添加点击事件
- 利用RecycleView实现类似ListView的Item点击,长按等操作事件以及点击后每一项在添加一个列表
- RecyclerView的使用以及下拉刷新自动加载(添加点击事件、头部)
- RecyclerView使用(二)多种Item布局、添加点击事件
- Android TV开发:使用RecycleView实现横向的Listview并响应点击事件的代码
- android recyclerview的使用,添加分割线,点击,长按事件
- Android RecyclerView使用(二) -给Item添加点击事件
- react native中使用react-native-viewpager实现的商品展示添加点击事件
- 在RecycleView或XRecycleView中添加点击事件
- android TV开发:使用RecycleView实现横向的Listview并响应点击事件
- IOS自定义View使用block实现点击事件
- iOS 为自定义tableView添加button点击事件后获取其序号