1.recyclerView相对listView的优点:
a.使用更加灵活
b.强制绑定了ViewHolder
2.recyclerView的设置思想:
a.不关心内部的item是否显示在正确的位置,如何显示<-----LayoutManager(设置LinearLayoutManager,GridLayoutManager)
b.不关心item间如何分隔<--------ItemDecoration(ListView可以通过Divider来设置)
c.不关心item增加与删除的动画效果<------ItemAnimator(可实现其子类)
d.仅仅关注如何回收与复用view
3.recyclerView的重要类:
a.Layoutmanager
该类决定recyclerView的布局模式:大致有如下几种模式:
-
LinearLayoutManager
-
GridLayoutManager
-
StaggeredGridLayoutManager
b.ItemDecoration
该类主要用来定义recyclerView的分隔线,recyclerView默认没有分隔线,需要程序员自己继承ItemDecoration类,实现自定义的样式
下面是github上已实现分隔线的地址:
https://github.com/dinuscxj/RecyclerItemDecoration
c.ItemAnimator
该类主要用来定义添加或删除recyclerView的条目时,所展现的动画效果,默认提供了DefaultItemAnimator的动画效果
程序员可以自定义动画效果,下面是github上已实现动画的地址:
https://github.com/gabrielemariotti/RecyclerViewItemAnimators
4.recyclerView具体实现(参考慕课网实例:http://www.imooc.com/video/8189)
a.导入recyclerView,如下图所示:
b.activity-main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:background="#d66666"
android:layout_height="60dp"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
c.自定义分隔线:
/**
* Created by yh on 2016/6/15.
* 自定义分隔线
*/
public class SampleItemDecoration extends RecyclerView.ItemDecoration {
private Context mContext;
private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
private Drawable mDivider;
public SampleItemDecoration(Context context) {
this.mContext = context;
TypedArray a = mContext.obtainStyledAttributes(ATTRS);
//获取分隔线对象
mDivider = a.getDrawable(0);
a.recycle();
}
@Override
public void onDraw(Canvas c, RecyclerView parent) {
//分隔线的左坐标
int left = parent.getPaddingLeft();
//分隔线的右坐标
int right = parent.getWidth() - parent.getPaddingRight();
/**
* 获取子view的个数
*/
int childCount = parent.getChildCount();
if (childCount > 0) {
for (int i = 0; i < parent.getChildCount(); i++) {
final View childView = parent.getChildAt(i);
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) childView.getLayoutParams();
//分隔线的上顶点
int top = childView.getBottom() + params.bottomMargin;
//分隔线的下顶点
int buttom = top + mDivider.getIntrinsicHeight();
//设置分隔线的画线的范围
mDivider.setBounds(left, top, right, buttom);
mDivider.draw(c);
}
}
super.onDraw(c, parent);
}
}
d.给recyclerView添加分隔线:
DividerItemDecoration itemDecoration = new DividerItemDecoration(getApplicationContext(), DividerItemDecoration.VERTICAL_LIST);
mRecyclerView.addItemDecoration(itemDecoration);
e.给recyclerView添加动画效果:
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
f.定义adapter:
public class SimpleAdapter extends RecyclerView.Adapter<SimpleViewHolder> {
private Context mContext;
private List<String> mDatas;
private LayoutInflater mInflater;
public SimpleAdapter(Context context, List<String> datas) {
mContext = context;
mDatas = datas;
mInflater = LayoutInflater.from(context);
}
@Override
public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.simple_textview, parent, false);
SimpleViewHolder viewHolder = new SimpleViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(final SimpleViewHolder holder, final int position) {
holder.mTextView.setText(mDatas.get(position));
holder.mTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mOnclickListener!=null){
int position=holder.getLayoutPosition();
mOnclickListener.onClick(position);
}
}
});
}
@Override
public int getItemCount() {
return mDatas.size();
}
/**
* 添加条目
*
* @param position
*/
public void addItem(int position) {
mDatas.add(position,"inserted one");
notifyItemInserted(position);
}
/**
* 删除条目
* @param position
*/
public void deleteItem(int position) {
mDatas.remove(position);
notifyItemRemoved(position);
}
private OnClickListener mOnclickListener;
public void setOnclickListener(OnClickListener onclickListener){
this.mOnclickListener=onclickListener;
}
public interface OnClickListener{
void onClick(int position);
}
}
注意adapter必须继承RecyclerView.Adapter
ViewHolder必须继承RecyclerView.ViewHolder
删除和添加条目时,调用的是
notifyItemInserted(position);
notifyItemRemoved(position);
g.给recyclerView添加点击事件:
由于RecyclerView没有提供点击和长按的监听事件,则需要自己在自定义adapter中使用接口回调的方式添加相应的监听器,具体步骤:
1.申明一个接口,里面提供相应的方法。
2.定义一个类级别的接口对象。
3.定义一个set方法用于外部传递接口变量。
4.在onBindView方法中调用。
h.在外部调用set方法实现点击事件:
/**
* 给recyclerView设置点击事件
*/
mAdapter.setOnclickListener(new SimpleAdapter.OnClickListener() {
@Override
public void onClick(int position) {
Toast.makeText(MainActivity.this,position+"", Toast.LENGTH_SHORT).show();
}
});
i:源码地址:
https://github.com/yaoyoucai/RecycleView/tree/87ac001ad3a9ae3f823cce8494c7bcba0f82edbf