recyclerView简单解析
来源:互联网 发布:免费虚拟化软件 编辑:程序博客网 时间:2024/06/16 07:45
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
- recyclerView简单解析
- RecyclerView简单解析
- RecyclerView 解析
- RecyclerView 解析
- RecyclerView 解析
- RecyclerView解析
- RecyclerView解析
- RecyclerView解析
- RecyclerView CardView使用解析
- Android RecyclerView 使用解析
- RecyclerView完全解析
- RecyclerView完全解析
- android RecyclerView 完全解析
- Android RecyclerView完全解析
- Android RecyclerView 使用解析
- RecyclerView综合解析
- RecyclerView CardView使用解析
- RecyclerView 解析(一)
- Linux下安装可视化svn工具RabbitCvs
- omniCorba配置及开启name服务
- cocos2d-x 3.x学习之FadeAction
- Camera Calibration Toolbox for Matlab
- IOS 富文本 ,设置行间距、字间距,计算高度(转载组合而成)
- recyclerView简单解析
- Swift anyobject 如何把value强转成String类型,或者判断value的类型?
- iOS文字上下滚动效果的实现
- android opengl学习推荐博文
- Dialog里面弹不出软键盘 软键盘不出现
- python version 2.7 required,which was not found in the registry
- 安卓应用所用到的插件及知识点
- 调整数组顺序使奇数位于偶数前面
- 创建与使用触发器