Recycleview使用详情及添加点击事件

来源:互联网 发布:倩女幽魂有没有mac版 编辑:程序博客网 时间:2024/05/16 18:27

前言

记录一下自己自学Recycleview的过程吧,仅供新手入门学习。

首先来说说我对Recycleview的看法吧,我对Recycleview和listview主要就是Recycleview显示类型,既可以是gridview,也可以使瀑布流式的显示,只需更改layoutmanager,非常方便,而具体的区别,网上也有很多人说了,有兴趣深入了解的也可以看一看文章最后的一篇文章, 他对Recycleview和listview做了充分的对比。

Recycleview的使用详情

Recycleview需要两个设置:

  • 布局设置 LayoutManager
  • 适配器设置 Adapter

一、 布局设置 LayoutManager

LayoutManager只是一个抽象类而已,主要靠三个实体类来实现布局展示方式:
LinearLayoutManager(线性布局效果)、GridLayoutManager(网格布局效果)、StaggeredGridLayoutManager(瀑布流布局效果)。

1. 使用LinearLayoutManager

创建LinearLayoutManager,然后以setOrientation()设置方向(如果不填写,默认纵向滚动),最后给recycleview添加layoutManager

    LinearLayoutManager 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();}//创建布局@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycleview,parent,false);    return new MyViewHolder(view);}//绑定数据@Overridepublic void onBindViewHolder(MyViewHolder holder, int position) {    holder.textview.setText(text[position]);}//获取条目数量@Overridepublic int getItemCount() {    return text.length;}@Overridepublic 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中添加一下代码

 //创建布局@Overridepublic 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);} //绑定数据@Overridepublic void onBindViewHolder(MyViewHolder holder, int position) {    holder.textview.setText(text[position]);    //给holder的itemview添加Tag为position    holder.itemView.setTag(position);}  @Overridepublic 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();}//创建布局@Overridepublic 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);}//绑定数据@Overridepublic void onBindViewHolder(MyViewHolder holder, int position) {    holder.textview.setText(text[position]);    //给holder的itemview添加Tag为position    holder.itemView.setTag(position);}//获取条目数量@Overridepublic int getItemCount() {    return text.length;}@Overridepublic 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"};@Overrideprotected 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使用对比分析

原创粉丝点击