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

前言

记录一下自己自学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();
}

//创建布局
@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,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 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使用对比分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值