【UI设计】4、RecycleView的使用
来源:互联网 发布:wap页面纯文字游戏源码 编辑:程序博客网 时间:2024/06/06 05:33
github传送门:https://github.com/lxcgithub/UIdesinge
包名:b_recyclerview
特点:
1.谷歌在高级版本提出一个新的替代ListView、GridView的控件。
2.高度解耦。
3.自带了性能优化。ViewHolder。
软件:低耦合高内聚。
(1)RecyclerView没有条目点击事件,需要自己写。
为了更高的扩展性,google并没有给我们封装点击事件,我们自己item布局自己设置点击事件(比如只有点击item中某个控件时才有效。)
(2)RecyclerView需要手动设置LayoutManager使使用时具有更高的扩展性。
为了更好的实现布局的多样化,实现GridView、ListView和瀑布流样式的切换,布局和视图解耦。
(3)RecyclerView可以给Item添加动画效果
(4)RecyclerView没有分割线,需要自己绘制
RecyclerView.ItemDecoration 1)线性的分割线 2)网格的分割线1).可以通过修改Theme.Appcompa主题样式里面的android:listSelector或者 android:listDivider属性 达到改变间隔线的大小和颜色哦!(自己尝试下)<style name="AppTheme" parent="AppBaseTheme"><item name="android:listDivider">@drawable/item_divider</item></style>2).写一个条目装饰类,继承 class MyItemDecoration extends RecyclerView.ItemDecoration{ } 绘制分发。绘制recyclerView的时候会分发Canvas到ItemDecoration里面。
(5)添加头部和底部:
ListView.addHeadView();ListView.addFooterView();RecyclerView没有这样的方法,需要自己解决所以我们通过看ListView的源码学习如何解决这个问题!!ListView.addHeaderView(){ if (mAdapter != null) { if (!(mAdapter instanceof HeaderViewListAdapter)) { mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter); }};ListView.setAdapter(){ if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) { mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter); } else { mAdapter = adapter; }}ListView.setAdapter(new SimpleAdapter(xxx))使用了中间代理模式解决的。模仿!!
代码:
1、布局管理器跟Item动画使用
recylerview = findViewById(R.id.recylerview); // 自定义添加点击事件的adapter: adapter = new MyRecyclerAdapter(list);// adapter = new MyStaggedRecyclerAdapter(list); //LayoutManager布局摆放管理器(线性摆放、瀑布流) recylerview.setLayoutManager(new LinearLayoutManager(this));//默认垂直 //reverseLayout:数据倒置,从右边开始滑动// recylerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true));// recylerview.setLayoutManager(new GridLayoutManager(this, 3)); //瀑布流效果// recylerview.setLayoutManager(new StaggeredGridLayoutManager(3, LinearLayoutManager.VERTICAL)); recylerview.setAdapter(adapter); // 添加动画 recylerview.setItemAnimator(new DefaultItemAnimator());
2、添加监听: 通过回调函数添加监听
// MyRecyclerAdapter:@Override public void onBindViewHolder(MyViewHolder holder, final int position) { //绑定数据 holder.tv.setText(list.get(position)); if(mOnItemClickListener!=null){ holder.itemView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onItemClick(v, position); } }); } } public interface OnItemClickListener{ void onItemClick(View view, int position); } public void setOnItemClickListener(OnItemClickListener listener){ this.mOnItemClickListener = listener; }// MainActivity:adapter.setOnItemClickListener(new MyRecyclerAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Toast.makeText(MainActivity.this, "点我干嘛"+position, Toast.LENGTH_SHORT).show(); } });
3、插入和删除单条数据:
// 插入数据 public void addData(int position){ list.add(position,"additem"+position); //提示刷新--会影响效率// notifyDataSetChanged(); notifyItemInserted(position); } // 删除数据 public void removeData(int position){ list.remove(position); notifyItemRemoved(position); }
4、添加分割线:
public class LinearLayoutColorDivider extends RecyclerView.ItemDecoration { private final Drawable mDivider; private final int mSize; private final int mOrientation; public LinearLayoutColorDivider(Resources resources, @ColorRes int color, @DimenRes int size, int orientation) { mDivider = new ColorDrawable(resources.getColor(color)); mSize = resources.getDimensionPixelSize(size); mOrientation = orientation; } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { int left; int right; int top; int bottom; if (mOrientation == LinearLayoutManager.HORIZONTAL) { top = parent.getPaddingTop(); bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount - 1; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); left = child.getRight() + params.rightMargin; right = left + mSize; mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } else { left = parent.getPaddingLeft(); right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount - 1; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); top = child.getBottom() + params.bottomMargin; bottom = top + mSize; mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { if (mOrientation == LinearLayoutManager.HORIZONTAL) { outRect.set(0, 0, mSize, 0); } else { outRect.set(0, 0, 0, mSize); } }}
5、添加头布局、底部局:
详见源码
阅读全文
0 0
- 【UI设计】4、RecycleView的使用
- Android RecycleView---- RecycleView的简单使用
- Recycleview的使用
- RecycleView的使用
- RecycleView 的使用
- Android RecycleView的使用
- RecycleView的简单使用
- RecycleView 的使用
- RecycleView的基础使用
- android RecycleView的使用
- RecycleView的学习使用
- RecycleView的使用(一)
- RecycleView的首次使用
- RecycleView的使用
- RecycleView的使用
- RecycleView 的简单使用
- recycleView的使用
- RecycleView的使用
- Ubuntu 17.10安装sklearn
- c++基础知识
- [LeetCode] 669.Trim a Binary Search Tree
- 版本控制之git命令行大全(分支教程)
- Spring-Session源码研究之processRequest
- 【UI设计】4、RecycleView的使用
- struts2的<s:property />的使用
- idea同步svn中的maven项目,配置项目(带Spring Boot启动类)
- TQ210裸机编程——printf
- 我的电路实验
- 图形登陆界面
- 按钮布局演示
- Spark的左外连接解决方案
- HDU5685 (费马小定理,逆元)