RecycleView加载布局和分割线
2018-03-02 10:16
274 查看
RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好。详细介绍看下面的链接
RecycleView详细介绍首先加入依赖
compile 'com.android.support:recyclerview-v7:26.1.0'
主页面和布局
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView>
主界面
public class MainActivity extends AppCompatActivity { private RecyclerView mRecy; List<Student> mList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); /** * 注意两个方法执行先后顺序,先初始化数据再初始化视图,否则报空指针 */ initData();//初始化数据 initView();//初始化view } private void initView() { // 初始化组件 mRecy = findViewById(R.id.recyclerview); /** * 加载布局管理器(三种管理器) */ // 1.线性布局管理器 mRecy.setLayoutManager(new LinearLayoutManager(this)); // 2.网格布局管理器 // mRecy.setLayoutManager(new GridLayoutManager(this,3)); // 3.流式布局管理器 // mRecy.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL)); //添加自定义分割线 mRecy.addItemDecoration(new MyDecoration(this, MyDecoration.VERTICAL_LIST)); // 初始化适配器 StudentListAdapter mStu = new StudentListAdapter(this, mList); mRecy.setAdapter(mStu); } private void initData() { mList = new ArrayList<Student>(); for (int i = 0; i < 60; i++) { Student s = new Student(); s.setUserName("我是第" + i + "个"); mList.add(s); } } }
模拟一个数据
public class Student { String userName; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } }
适配器
public class StudentListAdapter extends RecyclerView.Adapter<StudentListAdapter.StudentViewHolder> { Context mContext; List<Student> mList; public StudentListAdapter(Context mcontext, List mlist) { this.mContext = mcontext; this.mList = mlist; } // 加载视图 @Override public StudentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { StudentViewHolder viewHolder = new StudentViewHolder(LayoutInflater.from(mContext) .inflate(R.layout.name_tv, parent, false)); return viewHolder; } // 绑定视图 @Override public void onBindViewHolder(StudentViewHolder holder, int position) { if (mList != null && mList.size() > 0) { Student student = mList.get(position); holder.name_tv.setText(student.getUserName()); } } // 获取当前数据条目数量 @Override public int getItemCount() { return mList.size(); } // 自定义的ViewHolder,持有每个Item的的所有界面元素 class StudentViewHolder extends RecyclerView.ViewHolder { private TextView name_tv; public StudentViewHolder(View itemView) { super(itemView); name_tv = (TextView) itemView.findViewById(R.id.name_tv); } } }
子条目布局(name_tv)可以自己设置其他控件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> << 4000 span class="hljs-title">TextView android:id="@+id/name_tv" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="10dp" android:paddingTop="10dp" android:textSize="26sp" /> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@mipmap/ic_launcher" /> </LinearLayout>
添加RecycleView分割线
public class MyDecoration extends RecyclerView.ItemDecoration { private Context mContext; private Drawable mDivider; private int mOrientation; public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; //我们通过获取系统属性中的listDivider来添加,在系统中的AppTheme中设置 public static final int[] ATRRS = new int[]{ android.R.attr.listDivider }; public MyDecoration(Context context, int orientation) { this.mContext = context; final TypedArray ta = context.obtainStyledAttributes(ATRRS); this.mDivider = ta.getDrawable(0); ta.recycle(); setOrientation(orientation); } //设置屏幕的方向 public void setOrientation(int orientation) { if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { throw new IllegalArgumentException("invalid orientation"); } mOrientation = orientation; } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { if (mOrientation == HORIZONTAL_LIST) { drawVerticalLine(c, parent, state); } else { drawHorizontalLine(c, parent, state); } } //画横线, 这里的parent其实是显示在屏幕显示的这部分 public void drawHorizontalLine(Canvas c, RecyclerView parent, RecyclerView.State state) { int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); //获得child的布局信息 final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); //Log.d("wnw", left + " " + top + " "+right+" "+bottom+" "+i); } } //画竖线 public void drawVerticalLine(Canvas c, RecyclerView parent, RecyclerView.State state) { int top = parent.getPaddingTop(); int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); //获得child的布局信息 final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicWidth(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } //由于Divider也有长宽高,每一个Item需要向下或者向右偏移 @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { if (mOrientation == HORIZONTAL_LIST) { //画横线,就是往下偏移一个分割线的高度 outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { //画竖线,就是往右偏移一个分割线的宽度 outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } } }
相关文章推荐
- 使用RecycleView加载不同的布局(类似淘宝京东购物车+推荐商品列表)
- 如何避免RecycleView复杂多条目布局时的加载不流畅
- RecycleView设置分割线和布局方向
- android控件使用---recycleview自定义上拉加载,和加载多个布局及加入动画
- 【RecycleView加分割线】Android RecycleView列表布局添加分割线如此简单
- Recycleview实现多条目加载布局
- Android开发笔记之RecycleView加载不同item布局的实现
- Github第一个工程:RecycleView加载新闻显示
- 快速实现RecycleView的网格和瀑布流布局添加头部(尾部原理一样,故略之)
- UI一揽子计划 21 (UICollectionView、SDWebImage第三方类库加载图片的使用、集合视图的布局UICollectionViewFlowLayout 、自定义Cell、布局协议
- 自定义View(七)-View的工作原理- Activity的布局加载
- 【实训】自定义上拉加载下拉刷新的RecycleView
- RecycleView的上啦加载更多
- 组件和布局加载~LayoutInflater和findViewById() 的区别
- RecycleView添加分割线
- Android布局性能优化—从源码角度看ViewStub延迟加载技术
- include静态加载布局ViewStub动态加载布局
- android RecycleView复杂多条目的布局
- ImgeView通过加载布局,addview宽高无效问题
- RecycleView控件的使用(三) 实现上拉加载更多下拉刷新功能