RecyclerView

基本内容:

  • 要利用RecyclerView, 除了要定义好存储视图内容的类和规定好视图的样式外,最关键的是写好适配器.

  • 在创建一个针对我们存储视图的适配器的时候,首先要在适配器的内部重写好ViewHolder类,用来进行视图的缓存(ViewHolder类拥有的成员由视图内容的类的成员来决定)

  • 适配器必须重写三个方法:

    • public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 
      
    • public void onBindViewHolder(ViewHolder holder, int position) 
      
    • public int getItemCount()
      
  • 1 方法用于创建一个ViewHolder实例用于加载视图的布局并缓存视图, 保证整个List中布局只从头加载了一次,提高效率

  • 2方法用于对List中的子项数据进行赋值, 它在滚动屏幕的时候,用于更新加载到屏幕中的视图,在加载每个视图的时候都会调用一次

  • 3方法用于返回数据源的长度

以上方法都由Android进行调用,我们只需要关注它执行时的逻辑即可

LinearLayout布局:

  • 在声明LayoutManager的时候声明为线性, 它的默认排列方式是垂直,可以设置为水平;这种布局让每一个Item只单独按照一列或者一行来排列

  • 在写xml样式的时候, 注意调整好每一个View的宽度和高度

StaggeredGridLayout布局:

  • 在声明LayoutManager的时候声明为瀑布流类型, 你可以在声明的构造函数中:

    int col;
    StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(col,StaggeredGridLayoutManager.VERTICAL);
    

    代码中用col来指定瀑布流的列数, 并指定它是横向的还是纵向的

  • 在写xml样式的时候, 注意View的宽度应该设为"match_parent" 因为实际上安卓会根据所分的列数来自动调整宽度; 我们还可以灵活的设置margin属性来调整控件之间的距离,看起来更舒适.

GridLayout布局

  • 在在声明LayoutManager的时候声明为网格类型, 你可以在声明的构造函数中

    int col;
    GridLayoutManager layoutManager = new GridLayoutManager(this,col);
    

    代码中用col来指定一行有多少个网格

ItemDecoration类

ItemDecoration类作用的官方文档描述:

ItemDecoration允许应用程序从适配器的数据集中为特定的项目视图添加一个特殊的绘图和布局偏移。这对于在项目之间绘制 分隔线、高亮、可视化分组边界等都很有用。

最常用的例子就是在每一个Item之间添加分割线,来区分不同的内容

ItemDecoration通常有三种模式选择:

public void onDraw(Canvas c, RecyclerView parent, State state);
public void onDrawOver(Canvas c, RecyclerView parent, State state);
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state);

我们简单了解他们的应用:

  • public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state);
    

    这个方法中, Rect 表示一个矩形,通过重写这个方法,我们可以设置包围在view外侧的矩形区域到view四周的长度,在没有设置时,这些长度都默认为0,设置后,在你所设置的方向的长度上会填充出一个矩形区域,实现和其他的item相隔。但这个矩形区域的默认颜色为灰色,并且无法更改,我们可以通过下文的其他的方法来绘制这个区域 , 实现更精细的分割线效果

  • public void onDraw(Canvas c, RecyclerView parent, State state);
    

    这个方法的参数Canvas为安卓的画布类,它封装了许多在View上进行绘图的方法, 我们利用这个类来进行我们希望的绘图. Canvas 对象可以根据给定的位图,在指定的坐标上面进行绘制,通常,在绘制之前我们要先声明一个Paint类的对象,作为我们的"画笔", 我们可以给画笔设置各种属性,配合Canvas完成绘图. CanvasPaint的方法有很多,需要时我们再查询文档即可.

    现在,我们可以利用getItemOffsetsonDraw两个方法来绘制美观的分割线了,这个博文有详细的做法:

    ItemDecoration应用

    后续将持续更新RecycleeView的实际应用场景

posted @ 2021-01-27 13:00  落月江树  阅读(151)  评论(0)    收藏  举报