1.引入:
在moudle中的build.gradle文件里,找到dependencies,添加关于recyclerView的引用:
compile 'com.android.support:recyclerview-v7:24.2.0' //这里的版本需要和V7包相对
- 1
其实design包中含有Material Design相关的很多控件,其中也包括了recyclerView的代码,所以你也可以通过引用design包来使用recyclerView:
compile 'com.android.support:design:23.2.0' //同样的版本需要一样
下面介绍一种避免依赖冲突的方法
2.在Xml中的使用:
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
3.在代码中的使用:
- RecyclerView需要设置样式才能显示出数据:
new LinearLayoutManager(getApplicationContext()); //显示为listView样式
new GridLayoutManager(getApplicationContext(),3); //显示为Grid样式
//显示为横向的Grid true为是否逆转
new GridLayoutManager(getApplicationContext(), 3, GridLayoutManager.HORIZONTAL, false);
//显示为瀑布流 可以设置方向
new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
mRv = (RecyclerView) findViewById(R.id.rv); //找到控件
//必须要设置layout样式才能使用
mLinearLayoutManager = new LinearLayoutManager(getApplicationContext());
mRv.setLayoutManager(mLinearLayoutManager);
- 可以给每个Item设置动画效果,可也自定义可以使用第三方:
我这里使用的是第三方,自定义的比较麻烦,下面是依赖地址:
compile 'jp.wasabeef:recyclerview-animators:2.2.6'
下面是代码中的使用:
//可以给item设置动画 使用的是第三方动画库
mRv.setItemAnimator(new FadeInRightAnimator());
- 1
- 2
RecyclerView必须自定义分割线,这里也是使用的第三方
compile 'com.yqritc:recyclerview-flexibledivider:1.4.0'
- 1
//手动设置分割线 使用的第三方
mRv.addItemDecoration(new HorizontalDividerItemDecoration.Builder(this)
.color(Color.RED) //颜色
.size(2) //大小
.margin(0,2) //距离
.build());
5.Adpater类代码
RecyclerView中的Adapter与ListView中的Adapter不同:这里直接加上了样式的选择.
public class myAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
//确定数据个数
@Override
public int getItemCount() {
return mData.size();
}
@Override
public int getItemViewType(int position) {
//可能根据数据的字段来指定对应的type
if(position%2==0){
return TYPE_ONE;
}else{
return TYPE_TWO;
}
}
//确定布局
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//当有多个Item样式时先进行判断
if (viewType == TYPE_ONE){
//加载布局
View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
//创建ViewHolder对象
MyViewHolder myHolederView = new MyViewHolder(inflate);
//查找控件
myHolederView.tv = (TextView) inflate.findViewById(tv);
return myHolederView;
}
//显示不同的布局
if (viewType == TYPE_TWO){
//创建不同的ViewHolder
return null;
}
return null;
}
//设置值
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
//有可能会有多种Item的显示样式,所有在设置值之前要进行判断
if (getItemViewType(position) == TYPE_ONE){
//设置值
MyViewHolder viewHolder = (MyViewHolder) holder;
viewHolder.tv.setText(mData.get(position));
}
if (getItemViewType(position) == position){
//强转成不同的ViewHolder进行赋值
}
//设置Item的点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击事件回调到Activity
if (mListerent != null){
mListerent.onitemLister(v,position);
}
}
});
}
}
RecyclerView中不提供Item的点击事件,这是只能在Adapter中设置,但为了更好的编辑代码,需要把点击事件回调到Activity中进行处理
创建一个接口回调点击事件:
//设置一个回调的接口
interface IRecyclerItemChangeListerent {
void onitemLister(View v,int postion);
}
6.上面介绍是对RecyclerView的初步使用,在项目中为了减低耦合,需要对Adapter类进行抽取,下面代码进行了简单的抽取,可供参考使用:
public abstract class BaseAdapterss<T> extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
ArrayList<T> mData; //数据
IRecyclerItemChangeListerent mListerent; //回调接口
//设置数据的方法
public void setData(ArrayList<T> data ){
this.mData = data;
}
//获取显示数量
@Override
public int getItemCount() {
return mData != null ? mData.size() : 0;
}
//设置点击事件借口回调
public void setListerent(IRecyclerItemChangeListerent listerent){
mListerent = listerent;
}
//设置一个回调的接口
interface IRecyclerItemChangeListerent {
void onitemLister(View v, int postion);
}
//返回Item显示的不同布局
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//抽象方法,子类出具体实现
return getLayout(parent,viewType);
}
//对Item的数据进行赋值
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
//抽象方法子类去具体实现
setItemData(holder,position);
//设置Item的点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//点击事件回调到Activity
if (mListerent != null){
mListerent.onitemLister(v,position);
}
}
});
}
//抽象方法,子类实现具体操作
protected abstract void setItemData(RecyclerView.ViewHolder holder, int position);
protected abstract RecyclerView.ViewHolder getLayout(ViewGroup parent, int viewType);
}
模拟子类继承
//具体操作
public class MyAdapters extends BaseAdapterss<String> {
private static final int TYPE_ONE = 0; //item的显示样式
private static final int TYPE_TWO = 1; //item的显示样式
@Override
public int getItemViewType(int position) {
//可能根据数据的字段来指定对应的type
if(position%2==0){
return TYPE_ONE;
}else{
return TYPE_TWO;
}
}
@Override
protected void setItemData(RecyclerView.ViewHolder holder, int position) {
//有可能会有多种Item的显示样式,所有在设置值之前要进行判断
if (getItemViewType(position) == TYPE_ONE){
//设置值
MyViewHolder viewHolder = (MyViewHolder) holder;
viewHolder.tv.setText(mData.get(position));
}
if (getItemViewType(position) == position){
//强转成不同的ViewHolder进行赋值
}
}
@Override
protected RecyclerView.ViewHolder getLayout(ViewGroup parent, int viewType) {
//当有多个Item样式时先进行判断
if (viewType == TYPE_ONE){
//加载布局
View inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
//创建ViewHolder对象
MyViewHolder myHolederView = new MyViewHolder(inflate);
//查找控件
myHolederView.tv = (TextView) inflate.findViewById(tv);
return myHolederView;
}
//显示不同的布局
if (viewType == TYPE_TWO){
//创建不同的ViewHolder
return null;
}
return null;
}
}