vLayout学习笔记

vlayout(VirtualLayout)是阿里开源的一个针对 RecyclerView 的 LayoutManager 扩展,主要提供一整套布局方案和布局间的组件复用。

下面主要简述一下个人读官方文档和实践demo的心得,demo的GitHub地址放在文末,欢迎各位大佬指教~

1.初始化RecycleView, 基于上下文,初始化一个VirtualLayoutManager;

recyclerView.setLayoutManager(layoutManager);

将这个VirtualLayoutManager设置进去recyclerView;

2.利用第一步的VirtualLayoutManager创建一个DelegateAdapter ;

DelegateAdapter delegateAdapter = new DelegateAdapter(layoutManager, hasConsistItemType);

3.1. 准备一个Adapter列表:

List<Adapter> adapterList = new ArrayList<>();

添加(add)各种Adapter, add的参数即自定义adapter, 这里的自定义adapter是SubAdapter;(代码来自官网demo)

        adapterList.add(new SubAdapter(new LinearLayoutHelper(20), 20));
        adapterList.add(new SubAdapter(new StickyLayoutHelper(true), 1));
        adapterList.add(new SubAdapter(new LinearLayoutHelper(20), 20));
        adapterList.add(new SubAdapter(new GridLayoutHelper(4), 80));
        // adapterList.add(new SubAdapter(new FixLayoutHelper(0, 0), 1));
        adapterList.add(new SubAdapter(new FixLayoutHelper(TOP_RIGHT, 0, 0), 1));

3.2. 自定义adapter的设计: 注意, 自定义adapter继承自DelegateAdapter.Adapeter, 泛型可以是自定义的ViewHolder; 构造函数一般接收两个参数, LayoutHelper以及一个数据参数(用于adapter的数据支持)

    private static class SubAdapter extends DelegateAdapter.Adapter<SubViewHolder> {

        private LayoutHelper mLayoutHelper;
        private int mItemCount;

        private SubAdapter(LayoutHelper layoutHelper, int itemCount) {
            mLayoutHelper = layoutHelper;
            mItemCount = itemCount;
        }

        @Override
        public LayoutHelper onCreateLayoutHelper() {
            return mLayoutHelper;
        }

        @Override
        public SubViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            return new SubViewHolder(inflater.inflate(R.layout.item, parent, false));
        }

        @Override
        public void onBindViewHolder(SubViewHolder holder, int position) {
            // do nothing
        }

        @Override
        protected void onBindViewHolderWithOffset(SubViewHolder holder, int position, int offsetTotal) {
            super.onBindViewHolderWithOffset(holder, position, offsetTotal);
            holder.setText(String.valueOf(offsetTotal));
            holder.itemView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        }

        @Override
        public int getItemCount() {
            return mItemCount;
        }

    }

对应的ViewHolder设计:

    private static class SubViewHolder extends RecyclerView.ViewHolder {

        public static volatile int existing = 0;
        public static int createdTimes = 0;

        public SubViewHolder(View itemView) {
            super(itemView);
            createdTimes++;
            existing++;
        }

        public void setText(String title) {
            ((TextView) itemView.findViewById(R.id.title)).setText(title);
        }

        @Override
        protected void finalize() throws Throwable {
            existing--;
            super.finalize();
        }
    }

以上,通过给, 继承自DelegateAdapter.Adapter自定义Adapter 设置不同的LayoutHelper,实现了各种各样的布局adapter 然后我们把这些各种各样的布局adapter 加入到一个List<Adapter> adapterList中去, 接下来我们把这个adapterList 设置到delegateAdapter中去:

        delegateAdapter.addAdapters(adapterList);

这里便是VLayout的美妙之处, 我们可以通过继承DelegateAdapter.Adapter 创建一个自定义的Adapter,顺带配备对应的ViewHolder业务容器 给这个自定义AdapteronCreateLayoutHelper()传入 各种各样不同类型不同构造形参LayoutHelper 配合传给自定义Adapter的数据支持参数位 又可以实现各种各样的布局效果 而这些个各种各样不同的布局adapterList), 又可以加到同一个delegateAdapter中, 借助delegateAdapterVirtualLayoutManager 各种各样这些个布局 整到同一个RecycleView中!

4.最后画龙点睛:

recycler.setAdapter(delegateAdapter);

  • adapter的设计跟RecycleView的adapter设计差不多, 都是onCreateViewHolder/ViewHolder/onBindViewHolder/getItemCount四部曲罢了:

DelegateAdapter.Adapter无非就是多了个决定布局类型onCreateLayoutHelper()方法罢了;

  • 注意getItemCount可以用来控制显示的数量, 可以是数据List的Size, 也可以通过设定Adapter构造方法,在被调用时通过new过程获取; 其他的就在自定义的Adapter中、在自定义ViewHolder中添加业务逻辑/业务方法函数即可; 比如可以在onBindViewHolder()return之前加套if逻辑组, 通过给不同的LayoutHelper设定不同的item颜色等等;
  • LayoutHelper实例可以通过Java代码在LayoutHelper层进行UI设计约束 item层可以通过在adapter.java中用java代码或者在xml中进行UI设计约束 其中xml记得巧用drawable文件设计:

实战demo的GitHub地址

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一个关于R包报错的tip

    凌川江雪
  • Android网络 | URL和URLConnection详解及其实战案例

    凌川江雪
  • AT80C51串口通信编程

    凌川江雪
  • SAP最佳业务实践:ETO–报价处理(232)-3创建项目

    image.png CJ20N创建项目 现在创建客户报价项目,以进一步添加报价明细(例如,计划、付款处理),但是此阶段主要是计算成本,作为计算报价中总价格的基础...

    SAP最佳业务实践
  • ESA2GJK1DH1K基础篇: 来吧! 彻底了解一下MQTT

      首先,平时的时候咱做的TCP服务器都是,一个或者多个客户端连接咱做的TCP服务器,然后TCP服务器处理客户端的数据.

    杨奉武
  • Yii2.0 RESTful API 基础配置教程

    这是安装Yii2.0的首选方法。如果你还没有安装 Composer,你可以按照这里的说明进行安装。

    hedeqiang
  • Event事件

    线程间状态同步:即将一个任务丢到子进程中,这个任务将异步执行,如何获取到这个任务的执行状态

    小小咸鱼YwY
  • Gradle 6 提示有内容将会在 7 的时候被丢弃

    Deprecated Gradle features were used in this build, making it incompatible with ...

    HoneyMoose
  • 解释器模式 Interpreter 行为型 设计模式(十九)

    如果形势变化非常多,这就不符合要求,因为加法和减法运算,两个运算符与数值可以有无穷种组合方式

    noteless
  • Java开发画板

    Test类 public class Test { public static void main(String[] args){ ...

    奋斗蒙

扫码关注云+社区

领取腾讯云代金券