您的位置:首页 > 其它

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添加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,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使用对比分析
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息