前言
记录一下自己自学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布局
然后写一个adapter中,包括一个内部类MyViewHolder继承RecyclerView.ViewHolder,你可以在这个这里写控件的点击事件
public class DemoAdapter extends RecyclerView.Adapter{ 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或其他控件基本一致
条目xml布局代码
Adapter中代码
public class DemoAdapter extends RecyclerView.Adapterimplements 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的时候阅读的一些博文,还有写这篇的时候也有借鉴,就粘出来,有兴趣的可以去看看。