RecyclerView基础
2017-09-17 00:54
204 查看
demo:
activity_main.xml
item.xml
主要方法有:
RecyclerView没有提供item的点击事件,需要自己定义。可以实现的方式有
1、在onCreateViewHolder时直接绑定自定义回调接口,上面已经实现。
2、实现RecyclerView的OnItemTouchListener,使用GestureDetectorCompat测量出item的位置。
个人比较喜欢第一种方式,比较简单。
主要方法:
4.1 RecyclerView.LayoutManager
这是一个抽象类。负责测量、定位items的位置,以及布局的复用。
4.2 LinearLayoutManager
线性布局管理器,提供了与ListView类似的方法。可以通过setOrientation(int orientation)设置布局是水平还是垂直布局。
4.3 GridLayoutManager
类似GridView。可以使用setSpanCount(int spanCount) 设置列数。还可以使用setSpanSizeLookup设置每个item占据的列数。
4.4 StaggeredGridLayoutManager
错落网格布局。可以onBindViewHolder中设置item不同的高度,实现瀑布流效果。
5.1 ItemTouchHelper
继承自RecyclerView.ItemDecoration。支持RecyclerView滑动删除和拖拽的实用工具类。具体实现
http://www.jianshu.com/p/68ddb102ac9c
SimpleItemAnimator是一个抽象类,由DefaultItemAnimator实现。自定义的话,需要实现SimpleItemAnimator的具体方法。
http://blog.csdn.net/axi295309066/article/details/52741810
总结:
RecycledView比ListView灵活很多,定制特殊的效果会比ListView方便很多。但是使用起来也略显复杂,如果只是常规的列表,ListView或许更使用。
import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; 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.OrientationHelper; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { List<Integer> data = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //设置数据源 for (int i = 0; i < 30; i++) data.add(i); //6.1 构造adapter final MyAdapter adapter = new MyAdapter(); //6.2 设置数据源 adapter.setData(data); //6.3 设置回调、需要自定义 adapter.setOnRecyclerItemClickListener(new OnRecyclerItemClickListener() { @Override public void onItemClick(RecyclerView.ViewHolder vh) { Log.e("=====", "temClick==>"+vh.getLayoutPosition()); } @Override public void onLongItemClick(RecyclerView.ViewHolder vh) { int position = vh.getLayoutPosition(); Log.e("=====", "remove==>"+position); adapter.remove(position); } }); //1 定义RecyclerView RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycle); //2 新建布局管理器 LinearLayoutManager manager = new LinearLayoutManager(this); //设置布局管理器的方向 manager.setOrientation(OrientationHelper.VERTICAL); //3 设置布局管理器 recyclerView.setLayoutManager(manager); //4 设置分割线 需要自己定义 xml没有设置分割线的属性 recyclerView.addItemDecoration(new MyItemDecoration()); //5 设置插入、删除动画 recyclerView.setItemAnimator(new DefaultItemAnimator()); //6 设置adapter recyclerView.setAdapter(adapter); } } //自定义item点击事件 interface OnRecyclerItemClickListener { void onItemClick(RecyclerView.ViewHolder vh); void onLongItemClick(RecyclerView.ViewHolder vh); } //自定义adapter class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{ private List<Integer> data; private OnRecyclerItemClickListener onRecyclerItemClickListener; //设置item监听 public void setOnRecyclerItemClickListener(OnRecyclerItemClickListener onRecyclerItemClickListener) { this.onRecyclerItemClickListener = onRecyclerItemClickListener; } //设置数据源 public void setData(List<Integer> data) { this.data = data; } //移除操作 public void remove(int position) { data.remove(position); //通知界面移除数据 notifyItemRemoved(position); } //自定义ViewHolder static class ViewHolder extends RecyclerView.ViewHolder{ ImageView img; TextView tv; public ViewHolder(View itemView) { super(itemView); img = (ImageView) itemView.findViewById(R.id.imageView); tv = (TextView) itemView.findViewById(R.id.textView); } } //创建ViewHolder @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View item = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); //新建ViewHolder final ViewHolder holder = new ViewHolder(item); //添加自定义监听 if(this.onRecyclerItemClickListener != null) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { onRecyclerItemClickListener.onItemClick(holder); } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { onRecyclerItemClickListener.onLongItemClick(holder); return false; } }); } return holder; } //绑定数据 @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.tv.setText(data.get(position) + ""); } //获取总条数 @Override public int getItemCount() { return data.size(); } } //自定义分割线 class MyItemDecoration extends RecyclerView.ItemDecoration { //分割线高度 private int dividerHeight = 5; @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); //设置分割线高度 outRect.bottom = dividerHeight; } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); int childCount = parent.getChildCount(); int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); //设置画笔 Paint p = new Paint(); p.setColor(Color.GRAY); for (int i = 0; i < childCount - 1; i++) { View view = parent.getChildAt(i); float top = view.getBottom(); //计算底部 float bottom = view.getBottom() + dividerHeight; //画分割线 c.drawRect(left, top, right, bottom, p); } } } //使用继承SimpleOnItemTouchListener方式实现item监听 //abstract class OnRecyclerItemClickListener extends RecyclerView.SimpleOnItemTouchListener { // private GestureDetectorCompat mGestureDetector; // private RecyclerView recyclerView; // // public OnRecyclerItemClickListener(final RecyclerView recyclerView) { // this.recyclerView = recyclerView; // mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(), new GestureDetector.SimpleOnGestureListener() { // @Override // public boolean onSingleTapUp(MotionEvent e) { // View childView = recyclerView.findChildViewUnder(e.getX(), e.getY()); // if (childView != null) { // RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(childView); // onItemClick(vh); // } // return true; // } // // @Override // public void onLongPress(MotionEvent e) { // View childView = recyclerView.findChildViewUnder(e.getX(), e.getY()); // if (childView != null) { // RecyclerView.ViewHolder vh = recyclerView.getChildViewHolder(childView); // onItemLongClick(vh); // } // } // }); // } // // //点击事件交给mGestureDetector处理 // @Override // public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { // mGestureDetector.onTouchEvent(e); // return false; // } // // //点击回掉 // public abstract void onItemClick(RecyclerView.ViewHolder vh); // // //长按监听 // public abstract void onItemLongClick(RecyclerView.ViewHolder vh); //}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout 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" tools:context="com.example.ms.mt.MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recycle" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.constraint.ConstraintLayout>
item.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@mipmap/ic_launcher" /> <TextView android:id="@+id/textView" android:layout_marginLeft="15dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="TextView" /> </LinearLayout>
1、RecyclerView
使用RecyclerView需要导入v7包。在Library depedency中导入2、RecyclerView.Adapter
RecyclerView的适配器类,与ListView的BaseAdapter类似。主要方法有:
//创建一个用于显示的View,之后将被复用 //View可以是不同的布局,需要依靠viewType区分 public abstract VH onCreateViewHolder(ViewGroup parent, int viewType); //绑定数据和view, //需要注意的是使用getAdapterPosition()可以得到更新的变化,而onBindViewHolder()中的position只在item无效或新View时才会更新 public abstract void onBindViewHolder(VH holder, int position); //返回数据总数 public abstract int getItemCount(); //更新数据 public final void notifyDataSetChanged() public final void notifyItemChanged(int position) public final void notifyItemInserted(int position) public final void notifyItemRemoved(int position) public final void notifyItemMoved(int fromPosition, int toPosition)
RecyclerView没有提供item的点击事件,需要自己定义。可以实现的方式有
1、在onCreateViewHolder时直接绑定自定义回调接口,上面已经实现。
2、实现RecyclerView的OnItemTouchListener,使用GestureDetectorCompat测量出item的位置。
个人比较喜欢第一种方式,比较简单。
3、RecyclerView.ViewHolder
用于保存RecyclerView的子View。主要方法:
//返回item的位置 //getAdapterPosition获取数据源的位置,比较即时。 //getLayoutPosition获取View在items中的位置,在数据更改后,由于view绘制的卡顿、动画,getLayoutPosition的获取的位置为view的位置,或许会与getAdapterPosition的结果有差距,但是会在16ms以内。 int getAdapterPosition() int getLayoutPosition () //获取view的类型 getItemViewType() //设置能否被回收,默认true setIsRecyclable(boolean recyclable)
4、LayoutManager
4.1 RecyclerView.LayoutManager
这是一个抽象类。负责测量、定位items的位置,以及布局的复用。
4.2 LinearLayoutManager
线性布局管理器,提供了与ListView类似的方法。可以通过setOrientation(int orientation)设置布局是水平还是垂直布局。
4.3 GridLayoutManager
类似GridView。可以使用setSpanCount(int spanCount) 设置列数。还可以使用setSpanSizeLookup设置每个item占据的列数。
4.4 StaggeredGridLayoutManager
错落网格布局。可以onBindViewHolder中设置item不同的高度,实现瀑布流效果。
5、RecyclerView.ItemDecoration
抽象类,用于实现分割线。主要方法://遍历RecyclerView中所有的item。使用outRect指定分割线的大小,单位为像素 getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) //画分割线,将先于绘制item执行,显示在item下面 onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) //后于item绘制,将覆盖在item上面 onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state)
5.1 ItemTouchHelper
继承自RecyclerView.ItemDecoration。支持RecyclerView滑动删除和拖拽的实用工具类。具体实现
http://www.jianshu.com/p/68ddb102ac9c
6、自定义动画
SimpleItemAnimator是一个抽象类,由DefaultItemAnimator实现。自定义的话,需要实现SimpleItemAnimator的具体方法。
7、RecycledViewPool
ViewHolder的对象池,减少创建、销毁对象的开销http://blog.csdn.net/axi295309066/article/details/52741810
8、添加头尾
http://blog.csdn.net/jxxfzgy/article/details/47012097总结:
RecycledView比ListView灵活很多,定制特殊的效果会比ListView方便很多。但是使用起来也略显复杂,如果只是常规的列表,ListView或许更使用。
相关文章推荐
- <Android 基础(四)> RecyclerView
- android中的recyclerview的基础学习(二)
- Android零基础入门第66节:RecyclerView点击事件处理
- Android零基础入门第64节:揭开RecyclerView庐山真面目
- RecyclerView基础
- Android零基础入门第66节:RecyclerView点击事件处理
- android studio recyclerview基础 自定义列表样式
- RecyclerView基础用法
- RecyclerView的基础用法
- Android零基础入门第64节:揭开RecyclerView庐山真面目
- Android基础控件——RecyclerView实现拖拽排序侧滑删除效果
- Android基础学习总结(二)——六步轻松搞定RecyclerView简单应用
- RecyclerView基础介绍
- RecyclerView 基础概念讲解
- BaseRecyclerViewAdapterHelper之BaseQuickAdapter的基础用法
- RecyclerView基础知识---------(1)
- RecyclerView的基础用法
- 封装RecyclerView的基础适配器BaseAdapter
- Android RecyclerView 基础知识详解
- RecyclerView Part 1:为ListView专家写的基础