Android中的RecycleView
来源:互联网 发布:python抓取json数据 编辑:程序博客网 时间:2024/06/10 20:25
RecycleView原理图
RecycleView使用
(1)gradle
compile 'com.android.support:recyclerview-v7:24.1.0'
(2)XML
<android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
(3)代码
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);recyclerView.setAdapter(adapter);recyclerView.setLayoutManager(layoutManager);
(4)RecycleView.Adapter
public static abstract class Adapter<VH extends ViewHolder> {//返回itemViewpublic abstract VH onCreateViewHolder(ViewGroup parent, int viewType);//绑定数据public abstract void onBindViewHolder(VH holder, int position);
(5)ItemAnimator
SimpleItemAnimator中的方法
public void runPendingAnimations()public void endAnimation(ViewHolder item)public void endAnimations()public boolean isRunning()
itemAnimator中的回调方法
实例代码
public class FadeInItemAnimator extends SimpleItemAnimator { private List<ViewHolder> pendingAddViewHolderList = new ArrayList<>(); private List<ViewHolder> addAnimationViewHolderList = new ArrayList<>(); //动画移动 @Override public boolean animateRemove(ViewHolder holder) { return false; } //动画添加 @Override public boolean animateAdd(ViewHolder holder) { View view = holder.itemView; ViewCompat.setAlpha(view, 0); pendingAddViewHolderList.add(holder); return true; } //动画移动 @Override public boolean animateMove(ViewHolder holder, int fromX, int fromY, int toX, int toY) { return false; } //动画改变 @Override public boolean animateChange(ViewHolder oldHolder, ViewHolder newHolder, int fromLeft, int fromTop, int toLeft, int toTop) { return false; } //运行动画时 @Override public void runPendingAnimations() { for (int i = 0; i < pendingAddViewHolderList.size(); i++) { final ViewHolder viewHolder = pendingAddViewHolderList.get(i); addAnimationViewHolderList.add(viewHolder); View view = viewHolder.itemView; final ViewPropertyAnimatorCompat animator = ViewCompat.animate(view); animator.alpha(1).setDuration(1000).setListener(new ViewPropertyAnimatorListener() { @Override public void onAnimationStart(View view) { } @Override public void onAnimationEnd(View view) { animator.setListener(null); ViewCompat.setAlpha(view, 1); dispatchAddFinished(viewHolder); addAnimationViewHolderList.remove(viewHolder); if (!isRunning()) { dispatchAnimationsFinished(); } } @Override public void onAnimationCancel(View view) { } }).start(); } pendingAddViewHolderList.clear(); } //单个Item动画结束时 @Override public void endAnimation(ViewHolder item) { View view = item.itemView; ViewCompat.animate(view).cancel(); for (int i = 0; i < pendingAddViewHolderList.size(); i++) { ViewHolder viewHolder = pendingAddViewHolderList.get(i); if (viewHolder == item) { pendingAddViewHolderList.remove(i); ViewCompat.setAlpha(view, 1); dispatchAddFinished(item); } } if (!isRunning()) { dispatchAnimationsFinished(); } } //全部动画结束时 @Override public void endAnimations() { for (int i = 0; i < pendingAddViewHolderList.size(); i++) { ViewHolder viewHolder = pendingAddViewHolderList.get(i); View view = viewHolder.itemView; pendingAddViewHolderList.remove(i); ViewCompat.setAlpha(view, 1); dispatchAddFinished(viewHolder); } for (int i = 0; i < addAnimationViewHolderList.size(); i++) { ViewHolder viewHolder = addAnimationViewHolderList.get(i); View view = viewHolder.itemView; ViewCompat.animate(view).cancel(); } } @Override public boolean isRunning() { return !pendingAddViewHolderList.isEmpty() || !addAnimationViewHolderList.isEmpty(); }}
(6)ItemDecoration
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() { private Drawable divider = getResources().getDrawable(R.drawable.decoration_drawable); //在绘制内容下方,被item挡住 @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state);// final int childCount = parent.getChildCount();// for (int i = 0; i < childCount; i++) {// View child = parent.getChildAt(i);// int top = child.getBottom();// final int bottom = top + 10;// int left = child.getLeft();// int right = child.getRight();// divider.setBounds(left, top, right, bottom);// divider.draw(c);// } } //在绘制内容上方,挡住item @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(c, parent, state); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); int top = child.getBottom(); int bottom = top + 300; int left = child.getLeft(); int right = child.getRight(); divider.setBounds(left, top, right, bottom); divider.draw(c); } } //四周增加边距 @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); } });
(7)缺陷
没有Divider
没有HeaderView/FooterView
没有emptyView
没有onitemClicker
recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() { @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } });
0 0
- Android中的RecycleView
- android recycleView
- Android RecycleView
- Android-RecycleView
- 关于自己android学习中的RecycleView的问题
- Recycleview 使用中的问题
- Android RecycleView---- RecycleView的简单使用
- Android 5.0 Design RecycleView
- Android RecycleView(一)
- Android RecycleView的使用
- Android RecycleView汇总
- android recycleview使用
- android RecycleView的使用
- android recycleView使用总结
- Android recycleview+cardview
- Android RecycleView使用详解
- Android RecycleView分割线
- Android RecycleView 应用
- 虚拟机软件Parallels Desktop和VMware Fusion哪个好
- mongodb重命名方法
- ZCMU—1610
- 正则表达式-整理
- jquery常用操作说明
- Android中的RecycleView
- HTML添加图片
- java面向对象
- 周金涛:人生就是一次康波
- Network In Network笔记-ICLR 2014
- Tomcat 显示日志
- SSM框架重构达内NETCTOSS项目——(4)处理异常
- 检测点2.1
- batch slice layer