RecyclerView的那点事儿
RecyclerView
控件简介
- ListView的升级版
- LinearLayoutManager
- GridLayoutManager
- StaggeredGridLayoutManager
- 定制Item动画,指定Item之间的分隔线
RecyclerView相关的重要类
- Adapter
- ViewHolder
- LayoutManager
- ItemDecoration
- ItemAnimator
添加RecyclerView控件依赖包
Android Studio开发工具,在本项目的build.gradle文件中添加
compile 'com.android.support:recyclerview-v7:23.1.1'
如果是eclipse的话,下载jar包,放到lib下,一般都会自动的build path,检查下即可。
如何下载jar ?
在SDK Manager中下载Support Library
sdk\extras\android\support\v7\recyclerview\libs
为Recycler准备数据
package demo.turing.com.materialdesignwidget.recyclerView;import java.util.ArrayList;import demo.turing.com.materialdesignwidget.recyclerView.model.SampleModel;/*** MyApp** @author Mr.Yang on 2016-03-30 20:21.* @version 1.0* @desc*/
public class SimulatorData {public static ArrayList<SampleModel> getSampleModelData(int size) {ArrayList<SampleModel> sampleData = new ArrayList<SampleModel>(size);for (int i = 0; i < size; i++) {sampleData.add(new SampleModel("新的列表项< " + i + " >"));}return sampleData;}}
package demo.turing.com.materialdesignwidget.recyclerView.model;/*** MyApp** @author Mr.Yang on 2016-03-30 20:23.* @version 1.0* 对应Item中药显示的数据项*/
public class SampleModel {private String text;public SampleModel(String text) {this.text = text;}public String getText() {return text;}public void setText(String text) {this.text = text;}
}
绘制列表项之间的分隔线
package demo.turing.com.materialdesignwidget.recyclerView;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;/*** MyApp** @author Mr.Yang on 2016-03-30 20:37.* @version 1.0* 分隔条*** DividerItemDecoration https://gist.github.com/alexfu/0f464fc3742f134ccd1e*/
public class DividerItemDecoration extends RecyclerView.ItemDecoration {// 默认分隔条Drawable资源的ID,使用系统自带的private static final int[] ATTRS = new int[]{android.R.attr.listDivider};public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;private Drawable mDivider;private int mOrientation;public DividerItemDecoration(Context context, int orientation) {// 使用TypedArray装载定义的ATTRSfinal TypedArray a = context.obtainStyledAttributes(ATTRS);// 获取系统提供的分隔条Drawable对象mDivider = a.getDrawable(0);// 回收TypedArray所占用的空间a.recycle();setOrientation(orientation);}/*** 设置item的显示 水平 or 垂直** @param orientation*/public void setOrientation(int orientation) {if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {throw new IllegalArgumentException("invalid orientation");}mOrientation = orientation;}@Overridepublic void onDraw(Canvas c, RecyclerView parent) {if (mOrientation == VERTICAL_LIST) {drawVertical(c, parent);} else {drawHorizontal(c, parent);}}public void drawVertical(Canvas c, RecyclerView parent) {final int left = parent.getPaddingLeft();final int right = parent.getWidth() - parent.getPaddingRight();final int childCount = parent.getChildCount();for (int i = 0; i < childCount; i++) {final View child = parent.getChildAt(i);RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();final int top = child.getBottom() + params.bottomMargin;final int bottom = top + mDivider.getIntrinsicHeight();mDivider.setBounds(left, top, right, bottom);mDivider.draw(c);}}public void drawHorizontal(Canvas c, RecyclerView parent) {final int top = parent.getPaddingTop();final int bottom = parent.getHeight() - parent.getPaddingBottom();final int childCount = parent.getChildCount();for (int i = 0; i < childCount; i++) {final View child = parent.getChildAt(i);final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();final int left = child.getRight() + params.rightMargin;final int right = left + mDivider.getIntrinsicHeight();mDivider.setBounds(left, top, right, bottom);mDivider.draw(c);}}@Overridepublic void getItemOffsets(Rect outRect, int itemPosition,RecyclerView parent) {if (mOrientation == VERTICAL_LIST) {outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());} else {outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);}}}
实现Adapter
package demo.turing.com.materialdesignwidget.recyclerView.adapter;import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import java.util.ArrayList;
import java.util.Random;import demo.turing.com.materialdesignwidget.R;
import demo.turing.com.materialdesignwidget.recyclerView.SimulatorData;
import demo.turing.com.materialdesignwidget.recyclerView.model.SampleModel;/*** MyApp** @author Mr.Yang on 2016-03-30 21:03.* @version 1.0* @desc*/
public class SampleRecyclerAdapter extends RecyclerView.Adapter<SampleRecyclerAdapter.ViewHolder> {// 模拟数据private ArrayList<SampleModel> sampleData = SimulatorData.getSampleModelData(20);/*** 用于创建控件** @param parent* @param viewType* @return*/@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {// 获得列表项控件(LinearLayer对象)// list_basic_item.xml布局文件中只包含一个<LinearLayer>标签,// 在该标签中包含了一个<TextView>标签, item是LinearLayout对象View item = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_basic_item, parent, false);ViewHolder viewHolder = new ViewHolder(item);return viewHolder;}/*** 为控件设置数据** @param holder* @param position*/@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {// 获取当前item中显示的数据final SampleModel rowData = sampleData.get(position);// 设置要显示的数据holder.textViewSample.setText(rowData.getText());// 设置tagholder.itemView.setTag(rowData);}@Overridepublic int getItemCount() {return sampleData.size();}/*** 删除指定的Item** @param position*/public void removeData(int position) {sampleData.remove(position);// 通知RecyclerView控件某个Item已经被删除notifyItemRemoved(position);}/*** 在指定位置添加一个新的Item** @param positionToAdd*/public void addItem(int positionToAdd) {sampleData.add(positionToAdd, new SampleModel("新的列表项" + new Random().nextInt(10000)));// 通知RecyclerView控件插入了某个ItemnotifyItemInserted(positionToAdd);}/*** 对应Item中的控件*/public static class ViewHolder extends RecyclerView.ViewHolder {private final TextView textViewSample;public ViewHolder(View itemView) {super(itemView);textViewSample = (TextView) itemView.findViewById(R.id.textViewSample);}}}
完成使用RecyclerView控件的最后工作
package demo.turing.com.materialdesignwidget.recyclerView;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;import demo.turing.com.materialdesignwidget.R;
import demo.turing.com.materialdesignwidget.recyclerView.adapter.SampleRecyclerAdapter;public class RecyclerViewAct extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_recycler_view);// 获取RecyclerView对象RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view);// 创建线性布局管理器(默认是垂直方向)LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);// 为RecyclerView指定布局管理对象recyclerView.setLayoutManager(layoutManager);// 创建列表项分隔线对象RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST);// 为RecyclerView控件指定分隔线对象recyclerView.addItemDecoration(itemDecoration);SampleRecyclerAdapter sampleRecyclerAdapter = new SampleRecyclerAdapter();recyclerView.setAdapter(sampleRecyclerAdapter);}}
效果图
定制个性化分隔条
drawable\divider_custom.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"android:shape="rectangle"><size android:height="4dp"></size><!--渐变色--><gradient
android:centerColor="#ff0000ff"android:endColor="#ffff0000"android:startColor="#ffff0000"android:type="linear"></gradient></shape>
主题中设置
<item name="android:listDivider">@drawable/divider_custom</item>
瀑布流
StaggeredGridLayuoutAct.java
package demo.turing.com.materialdesignwidget.recyclerView;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;import java.util.List;import demo.turing.com.materialdesignwidget.R;
import demo.turing.com.materialdesignwidget.recyclerView.adapter.StaggeredGridLayoutAdapter;
import demo.turing.com.materialdesignwidget.recyclerView.model.SampleModel;/*** 不采用分隔线, 在Item的布局中 采用layout_margin的方式** 主要是动态设置View的高度 adapter类中的 onBindViewHolder*/public class StaggeredGridLayuoutAct extends AppCompatActivity {private RecyclerView recyclerView ;// 模拟数据private List<SampleModel> sampleData = SimulatorData.getSampleModelData(20);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_staggered_grid_layuout);// 查找组件recyclerView = (RecyclerView) findViewById(R.id.id_rv_staggered);// 创建布局管理器 -3列,垂直StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);// 设置布局recyclerView.setLayoutManager(manager);// AdapterStaggeredGridLayoutAdapter adapter = new StaggeredGridLayoutAdapter(this,sampleData);recyclerView.setAdapter(adapter);}
}
activity_staggered_grid_layuout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="demo.turing.com.materialdesignwidget.recyclerView.StaggeredGridLayuoutAct"><android.support.v7.widget.RecyclerView
android:id="@+id/id_rv_staggered"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView></RelativeLayout>
StaggeredGridLayoutAdapter.java
package demo.turing.com.materialdesignwidget.recyclerView.adapter;import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import java.util.ArrayList;
import java.util.List;import demo.turing.com.materialdesignwidget.R;
import demo.turing.com.materialdesignwidget.recyclerView.model.SampleModel;/*** MyApp** @author Mr.Yang on 2016-03-31 20:19.* @version 1.0* @desc*/
public class StaggeredGridLayoutAdapter extends RecyclerView.Adapter<StaggeredGridLayoutAdapter.ViewHolder> {private Context context;private List<SampleModel> datas;private LayoutInflater inflater;// 随机高度的结合private List<Integer> mHeights;/*** 构造函数** @param context* @param datas*/public StaggeredGridLayoutAdapter(Context context, List<SampleModel> datas) {this.context = context;this.datas = datas;this.inflater = LayoutInflater.from(context);// 初始化随机高度的集合mHeights = new ArrayList<>();for (int i = 0; i < datas.size(); i++) {mHeights.add((int)(100 + Math.random() * 300));}}@Overridepublic StaggeredGridLayoutAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {// 动态加载Item的布局文件View view = inflater.inflate(R.layout.list_basic_item, parent, false);// 实例化ViewHolderViewHolder viewHolder = new ViewHolder(view);return viewHolder;}@Overridepublic void onBindViewHolder(StaggeredGridLayoutAdapter.ViewHolder holder, int position) {// 获取当前Item中的显示的数据SampleModel sampleModel = datas.get(position);//设置控件的随机高度ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();lp.height = mHeights.get(position);holder.itemView.setLayoutParams(lp);// 设置组件的值holder.textView.setText(sampleModel.getText());// 设置tagholder.itemView.setTag(sampleModel);}@Overridepublic int getItemCount() {return datas.size();}/*** ViewHoder*/class ViewHolder extends RecyclerView.ViewHolder {TextView textView;public ViewHolder(View itemView) {super(itemView);textView = (TextView) itemView.findViewById(R.id.textViewSample);}}
}
list_basic_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="3dp"android:background="#6495ED"android:gravity="center"android:orientation="horizontal"><TextView
android:id="@+id/textViewSample"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:text="演示"/></RelativeLayout>
效果图
动画效果
// 默认动画效果recyclerView.setItemAnimator(new DefaultItemAnimator());
notifyItemRemoved(position)
/*** 删除指定的Item** @param position*/public void removeData(int position) {sampleData.remove(position);// 通知RecyclerView控件某个Item已经被删除notifyItemRemoved(position);}
notifyItemInserted(positionToAdd)
/*** 在指定位置添加一个新的Item** @param positionToAdd*/public void addItem(int positionToAdd) {sampleData.add(positionToAdd, new SampleModel("新的列表项" + new Random().nextInt(10000)));// 通知RecyclerView控件插入了某个ItemnotifyItemInserted(positionToAdd);}
为RecyclerView添加item的点击事件
方法一:利用回调的方式实现(不太完善,仍可实现)
实现步骤如下:
在adapter类中,定义接口,接口中定义两个方法分别对应click和longClick,定义完接口,添加接口和设置Adapter接口的方法:
/*** 接口 ,提供两个方法*/public interface OnRecyclerViewItemClickListener{// 单击事件void onItemClick(View view ,int position);// 长按触发的事件void onItemLongClick(View view ,int position);}// 定义OnRecyclerViewItemClickListener对象public OnRecyclerViewItemClickListener mOnRecyclerViewItemClickListener ;// 暴漏给外部的set方法,持有OnRecyclerViewItemClickListener对象public void setOnRecyclerViewItemClickListener(OnRecyclerViewItemClickListener listener){this.mOnRecyclerViewItemClickListener = listener ;}
在onBindViewHolder方法中
// 点击事件if(mOnRecyclerViewItemClickListener != null){// clickholder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mOnRecyclerViewItemClickListener.onItemClick(holder.itemView,position);}});// longClickholder.itemView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {mOnRecyclerViewItemClickListener.onItemLongClick(holder.itemView,position);return false;}});}
做完这些事情,我们就可以在Activity或其他地方为RecyclerView添加项目点击事件了,
// 设置监事件sampleRecyclerAdapter.setOnRecyclerViewItemClickListener(new SampleRecyclerAdapter.OnRecyclerViewItemClickListener() {@Overridepublic void onItemClick(View view, int position) {Toast.makeText(RecyclerViewAct.this,"Click" + position ,Toast.LENGTH_SHORT).show();}@Overridepublic void onItemLongClick(View view, int position) {Toast.makeText(RecyclerViewAct.this,"LongClick" + position ,Toast.LENGTH_SHORT).show();}});
完整代码如下:
RecyclerViewAct
package demo.turing.com.materialdesignwidget.recyclerView;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;import demo.turing.com.materialdesignwidget.R;
import demo.turing.com.materialdesignwidget.recyclerView.adapter.SampleRecyclerAdapter;public class RecyclerViewAct extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_recycler_view);// 获取RecyclerView对象RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view);// 创建线性布局管理器(默认是垂直方向)LinearLayoutManager layoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);// 为RecyclerView指定布局管理对象recyclerView.setLayoutManager(layoutManager);// 创建列表项分隔线对象RecyclerView.ItemDecoration itemDecoration = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST);// 为RecyclerView控件指定分隔线对象recyclerView.addItemDecoration(itemDecoration);// 默认动画效果recyclerView.setItemAnimator(new DefaultItemAnimator());SampleRecyclerAdapter sampleRecyclerAdapter = new SampleRecyclerAdapter();recyclerView.setAdapter(sampleRecyclerAdapter);// 设置监事件sampleRecyclerAdapter.setOnRecyclerViewItemClickListener(new SampleRecyclerAdapter.OnRecyclerViewItemClickListener() {@Overridepublic void onItemClick(View view, int position) {Toast.makeText(RecyclerViewAct.this,"Click" + position ,Toast.LENGTH_SHORT).show();}@Overridepublic void onItemLongClick(View view, int position) {Toast.makeText(RecyclerViewAct.this,"LongClick" + position ,Toast.LENGTH_SHORT).show();}});}}
SampleRecyclerAdapter
package demo.turing.com.materialdesignwidget.recyclerView.adapter;import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;import java.util.ArrayList;
import java.util.Random;import demo.turing.com.materialdesignwidget.R;
import demo.turing.com.materialdesignwidget.recyclerView.SimulatorData;
import demo.turing.com.materialdesignwidget.recyclerView.model.SampleModel;/*** MyApp** @author Mr.Yang on 2016-03-30 21:03.* @version 1.0* @desc*** RecyclerView 点击事件 请看http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1118/2004.html
*/
public class SampleRecyclerAdapter extends RecyclerView.Adapter<SampleRecyclerAdapter.ViewHolder> {// 模拟数据private ArrayList<SampleModel> sampleData = SimulatorData.getSampleModelData(20);/*** 接口 ,提供两个方法*/public interface OnRecyclerViewItemClickListener{// 单击事件void onItemClick(View view ,int position);// 长按触发的事件void onItemLongClick(View view ,int position);}// 定义OnRecyclerViewItemClickListener对象public OnRecyclerViewItemClickListener mOnRecyclerViewItemClickListener ;// 暴漏给外部的set方法,持有OnRecyclerViewItemClickListener对象public void setOnRecyclerViewItemClickListener(OnRecyclerViewItemClickListener listener){this.mOnRecyclerViewItemClickListener = listener ;}/*** 用于创建控件** @param parent* @param viewType* @return*/@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {// 获得列表项控件(LinearLayer对象)// list_basic_item.xml布局文件中只包含一个<LinearLayer>标签,// 在该标签中包含了一个<TextView>标签, item是LinearLayout对象View item = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_basic_item, parent, false);ViewHolder viewHolder = new ViewHolder(item);return viewHolder;}/*** 为控件设置数据** @param holder* @param position*/@Overridepublic void onBindViewHolder(final ViewHolder holder, final int position) {// 获取当前item中显示的数据final SampleModel rowData = sampleData.get(position);// 设置要显示的数据holder.textViewSample.setText(rowData.getText());// 设置tagholder.itemView.setTag(rowData);// 点击事件if(mOnRecyclerViewItemClickListener != null){// clickholder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 通过getLayoutPosition,防止position错位int layoutPosition = holder.getLayoutPosition();mOnRecyclerViewItemClickListener.onItemClick(holder.itemView,layoutPosition);}});// longClickholder.itemView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {int layoutPosition = holder.getLayoutPosition();mOnRecyclerViewItemClickListener.onItemLongClick(holder.itemView,layoutPosition);return false;}});}}@Overridepublic int getItemCount() {return sampleData.size();}/*** 删除指定的Item** @param position*/public void removeData(int position) {sampleData.remove(position);// 通知RecyclerView控件某个Item已经被删除notifyItemRemoved(position);}/*** 在指定位置添加一个新的Item** @param positionToAdd*/public void addItem(int positionToAdd) {sampleData.add(positionToAdd, new SampleModel("新的列表项" + new Random().nextInt(10000)));// 通知RecyclerView控件插入了某个ItemnotifyItemInserted(positionToAdd);}/*** 对应Item中的控件*/public static class ViewHolder extends RecyclerView.ViewHolder {private final TextView textViewSample;public ViewHolder(View itemView) {super(itemView);textViewSample = (TextView) itemView.findViewById(R.id.textViewSample);}}}
方法二:使用观察者模式实现
原理:
为RecyclerView的每个子item设置setOnClickListener,然后在onClick中再调用一次对外封装的接口,将这个事件传递给外面的调用者。而“为RecyclerView的每个子item设置setOnClickListener”在Adapter中设置。其实直接在onClick中也能完全处理item的点击事件,但是这样会破坏代码的逻辑。
步骤
在自定义的adapter(记得implements View.OnClickListener,下面有个onClick方法)中定义如下接口,模拟ListView的OnItemClickListener:
//define interfacepublic static interface OnRecyclerViewItemClickListener {void onItemClick(View view , String data);}
声明一个这个接口的变量:
private OnRecyclerViewItemClickListener mOnItemClickListener = null;
在onCreateViewHolder()中为每个item添加点击事件:
@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);ViewHolder vh = new ViewHolder(view);//将创建的View注册点击事件view.setOnClickListener(this);return vh;}
将点击事件转移给外面的调用者:
@Overridepublic void onClick(View v) {if (mOnItemClickListener != null) {//注意这里使用getTag方法获取数据mOnItemClickListener.onItemClick(v,(String)v.getTag());}}
意上面调用接口的onItemClick()中的v.getTag()方法,这需要在onBindViewHolder()方法中设置和item相关的数据
@Overridepublic void onBindViewHolder(ViewHolder viewHolder, int position) {viewHolder.mTextView.setText(datas[position]);//将数据保存在itemView的Tag中,以便点击时进行获取viewHolder.itemView.setTag(datas[position]);}
最后暴露给外面的调用者,定义一个设置Listener的方法():
public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {this.mOnItemClickListener = listener;}
以上所有步骤都发生在自定义的adapter中,典型的观察者模式,有点绕的地方在于,这里涉及到两个观察者模式的使用,view的setOnClickListener本来就是观察者模式,我们将这个观察者模式的事件监听传递给了我们自己的观察者模式。
在Activity中使用
mRecyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);//创建默认的线性LayoutManagermLayoutManager = new LinearLayoutManager(this);mRecyclerView.setLayoutManager(mLayoutManager);//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能mRecyclerView.setHasFixedSize(true);//创建并设置AdaptermAdapter = new MyAdapter(data);mRecyclerView.setAdapter(mAdapter);mAdapter.setOnItemClickListener(new OnRecyclerViewItemClickListener(){@Override public void onItemClick(View view , String data){Toast.makeText(MainActivity.this, data, 600).show();}});
~
RecyclerView添加Header
。。。。。。
RecyclerView的那点事儿相关推荐
- RecyclerView 配合 DiffUtil,RecyclerView局部刷新
一个问题: 每次从服务器取到数据后,都是调用adapter.notifyDataSetChanged();进行刷新.那局部刷新(adapter.notifyItemChanged();)的这些东西不是 ...
- Android RecyclerView(和SnapHelper) 实现类似ViewPager的效果
实现的效果图如下 2 行代码就实现了,其余的都是recyclerview 的代码 如果不显示一次可以滑动多个的话可以使用LinearSnapHelper 具体代码如下(实际就2行代码呢) recycl ...
- android RecyclerView 添加可拖动的滚动条
实现的效果图如下,为了效果这里我设置的宽了一些,实际根据需求修改即可 先说几个属性: android:scrollbars" 一般都是垂直的滚动条设置vertical android:scr ...
- RecyclerView 判断滑动到顶部和底部
可以使用系统提供的 canScrollVertically 方法来判断 具体如下 recycler_view.addOnScrollListener(new RecyclerView.OnScroll ...
- RecyclerView 刷新的时候出现阴影的处理方法
这个阴影是RecyclerView 的问题引起的 处理方法如下 recyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER); 这样阴影就消失了.
- RecyclerView 删除Item 以及删除整个RecyclerView
学而时习之,温故而知新. 今天用到了,居然忘记了,好尴尬,这里深夜了也在记录下, 1 删除整个RecyclerView hisList.clear();hisAdapter.notifyDataSet ...
- 2个RecyclerView 联动
看下效果图, 底部在给出demo地址 如果想实现类似拼多多的商品联动也是可以的,修改方法即可 下面看下实现方法 几个参数需要知道 findFirstVisibleItemPosition 显示界面第一 ...
- RecyclerView 滑动显示返回按钮,点击返回到顶部
底部有demo 地址*************************** 需要提前知道一些只是 RecyclerView.SCROLL_STATE_IDLE 是RecyclerView 滑动停止状态 ...
- RecyclerView smoothScrollToPosition 和 scrollToPosition 的区别
smoothScrollToPosition 是平衡的滑动 , 假如现在返回首页 recyclerView.smoothScrollToPosition(0); 看下效果图 scrollToPosi ...
最新文章
- Python-函数的各种器
- c语言中空格字符怎么表示_漫画:腾讯面试题,请实现把字符串中的空格替换为“%20”...
- 第二章:二分和前缀和 【完结】
- 小米11和小米10至尊版纪念版哪个好
- R语言-异常数据处理2
- JavaScript中call,apply,bind方法的总结
- 使用java连接mysql数据库
- 单片机编程软件IAR和烧写软件SmartRF安装教程(超详细)
- 关于键盘右边的 数字小写键盘不能使用的解决办法
- 绕过tp路由器管理密码_路由器管理员密码忘了怎么办 路由器管理员密码忘了解决方法【介绍】...
- QQ互联登录- 前端为 vue.js
- 重启服务器:docker重启,docker内部mysql怎么重启启动
- 转手动档汽车的换挡技巧
- 淘宝美工设计就业前景怎么样?有发展前途吗?
- CAD版本怎么转换?试试这种方法
- c语言双重循环教程,C语言教程之如何进行循环的嵌套详细程序实例说明
- 不同label样本画图——颜色分配plt.cm.Spectral
- android widget零基础,Android Widget详解(一)
- c语言中文件rw,bootloader和RO,RW,ZI在ARMC语言中
- 西门子培训1——RFID