安卓

自绘view实现自定义recyclerView的展示

2019-07-03  本文已影响0人  小熊兜里有糖

先上图,调用过程看起来极其复杂。


类之间的调用关系

类虽然很多,但是按照功能作用可以分成几个模块

关于ViewHolder的疑惑

在使用RecyclerView无可避免的要使用Adapter来进行数据的存放,而Adapter是有固定写法的,一般需要onCreateViewHolder来创建ViewHolder和OnBindViewHolder来绑定数据,但是我发现在我学习的项目中,这两个方法的参数和数据的绑定有所区别,所以,adapter到底是根据什么来绑定要显示的item的呢?

项目中的思想是,统一实现一个专用于ViewModel的Adapter,在这些Adapter中使用的都是ViewModel,所以传入ViewHolder的是ViewModel。
其实可以发现,无论在onCreateViewHolder中传入的参数是DataBinding还是ViewModel,只要在自定义的ViewHolder的构造方法中把要显示的View传进就可以了,这可以在源码中发现,

其实发现,无论自定义的ViewHolder传入的参数是什么类型的,调用父类的构造方法的时候,传入的都是view。所以只要获取的参数中的view传给父类构造方法,也就完成了绑定。

Adaptor部分

RowItemAdapter继承于AnsyncListVMAdapter继承于ViewModelAdapter,ViewModelAdapter是所有使用ViewModel的Adapter的父类,onBindViewHolder在这个类中实现,统一进行数据绑定,
RowItemAdapter和其他子类中实现了onCreateViewHoler方法,用于每个不同的子类调用工厂以创建出不同的符合条件的ViewModel,这两个方法在上面已经贴出,不展示了。但是onCreateViewHoler用于构建合适的ViewModel的标志innerViewType是从何而来呢,从同一个类的如下方法中返回,

@Override
public int getItemViewType(int position)
{
    final RowItem item = getItem(position);
    return item == null ? ViewType._VIEW_TYPE_EMPTY : item.mInnerViewType;
}

实际上传入Adapter的数据是元素为RowItem的Array,而这个RowItem是一个抽象类,所以Array中的数据是存放了一系列实现了特定抽象方法的对象,看看这个RowItem类

public abstract class RowItem
{
   public final int mInnerViewType;

   public RowItem(int innerViewType)
   {
      this.mInnerViewType = innerViewType;
    }

    public abstract void updateViewData(@NonNull TVViewModel model);
 }

可以看到实现这个类中有mInnerViewType变量,所以,数组中每一个元组都有这个值,根据position获取到特定位置的元素,即可获取到type从而创建ViewModel,在下面即将介绍的CanvasRowItem就必须要继承于RowItem,才能作为数据集被传到Adapter中,在RowItem中有一个updateViewData方法,也就是子类要实现的抽象方法,用于进行数据更新。

自绘View--Canvas部分

实际上就是把所有的CanvasNode作为元素存储在CanvasBundle的数组变量中,

View部分

CanvasView继承自SpecifySizeView继承自View

上一篇下一篇

猜你喜欢

热点阅读