Giter Club home page Giter Club logo

multitype's Introduction

MultiType Download

为实现RecyclerView显示多种类型数据,包括各种Headers、Footers,参考drakeet的扛鼎之作MultiType后, 着重优化了一对多的显示,即一种数据类型对应多种布局的情况,例如新闻数据类型(News.class)就可能显示 文本、左图、右图、大图、多图等多种item布局,面对这种情况就要根据数据中的类型字段(你指定属性的get()方法)去区分, 这里通过Java8的特性传递方法的引用,再通过KeyGenerator执行这个方法获取数据对应的值来解决这个问题的。

该库不仅可以显示同一种数据类型对应不同的layout,还可以显示不同数据类型对应不同的layout,如果你没有 通过MultiTypeRegistry全局注册或 通过MultiTypeAdapter局部注册过你的数据类型, 这个库不会让应用崩掉,会返回默认的提示layout,当然你也可以注册自己的默认数据类型,具体使用参考下面。

MultiState Download

MultiState 这个库为了管理请求数据的加载中、加载成功、加载失败、数据为空的情况,与MultiType配合使用更合适。

RecyclerViewWrapper Download

RecyclerViewWrapper 这个库结合【MultiType】和【MultiState】并使用了SmartRefreshLayout这个库来统一管理各个加载状态并简单封装了下拉刷新、上拉加载更多等相关功能,欢迎下载apk体验。

Sample预览图

Gradle配置

// MultiType
api 'com.sunfusheng:MultiType:<latest-version>'

// MultiState
api 'com.sunfusheng:MultiState:<latest-version>'

// RecyclerViewWrapper
compile 'com.sunfusheng:RecyclerViewWrapper:<latest-version>'

// 如果不想用库里版本的RecyclerView,可这样配置
api 'com.sunfusheng:RecyclerViewWrapper:<latest-version>', {
    exclude group: 'com.android.support'
}

// 如果同步不下来库的话,在工程下的 build.gradle 添加:
allprojects {
    repositories {
        maven { url 'https://dl.bintray.com/sfsheng0322/maven' }
    }
}

MultiType的使用

全局注册

MultiTypeRegistry.getInstance().register(News.class, News::getType, News.TYPE_TEXT, new TextBinder());
MultiTypeRegistry.getInstance().register(News.class, News::getType, News.TYPE_BIG_IMAGE, new BigImageBinder());
MultiTypeRegistry.getInstance().register(News.class, News::getType, News.TYPE_RIGHT_IMAGE, new RightImageBinder());
MultiTypeRegistry.getInstance().register(News.class, News::getType, News.TYPE_THREE_IMAGES, new ThreeImagesBinder());
MultiTypeRegistry.getInstance().register(Music.class, new MusicBinder());
MultiTypeRegistry.getInstance().register(Video.class, new VideoBinder());

注册默认或不支持类型

MultiTypeRegistry.getInstance().registerDefaultBinder(new NonsupportBinder());

局部注册,局部注册会覆盖全局的

MultiTypeAdapter multiTypeAdapter = new MultiTypeAdapter();
multiTypeAdapter.register(News.class, News::getType, News.TYPE_TEXT, new TextBinder());
multiTypeAdapter.register(News.class, News::getType, News.TYPE_BIG_IMAGE, new BigImageBinder());
multiTypeAdapter.register(News.class, News::getType, News.TYPE_RIGHT_IMAGE, new RightImageBinder());
multiTypeAdapter.register(News.class, News::getType, News.TYPE_THREE_IMAGES, new ThreeImagesBinder());
multiTypeAdapter.register(Music.class, new MusicBinder());
multiTypeAdapter.register(Video.class, new VideoBinder());

初始化,设置数据

RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(multiTypeAdapter);

multiTypeAdapter.setItems(@NonNull List<?> items);
multiTypeAdapter.notifyDataSetChanged();

MultiState的使用

属性 作用
loadingLayout 加载中布局
normalLayout 正常显示数据的布局
errorLayout 加载失败布局
emptyLayout 数据为空布局
loadingState 初始的加载状态

xml配置

<com.sunfusheng.multistate.MultiStateView
    android:id="@+id/multiStateView"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:loadingLayout="@layout/layout_loading"
    app:normalLayout="@layout/layout_recyclerview"
    app:errorLayout="@layout/layout_error"
    app:emptyLayout="@layout/layout_empty"
    app:loadingState="loading"/>

设置加载状态

multiStateView.setLoadingState(@LoadingState int loadingState);

APK下载地址,去手机上体验吧^_^


个人微信公众号


请作者喝杯咖啡^_^


关于我

GitHub: sunfusheng

个人邮箱: [email protected]

个人博客: sunfusheng.com

简书主页

新浪微博

multitype's People

Contributors

sunfusheng avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

multitype's Issues

MultiTypeAdapter line 98-122 onBindViewHolder()

    public final void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        onBindViewHolder(holder, position, Collections.emptyList());
    }

    @Override
    public final void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull List<Object> payloads) {
        viewBinder.onBindViewHolder(holder, items.get(position), payloads);

        if (onItemClickListener != null) {
            holder.itemView.setOnClickListener(v -> {
                if (onItemClickListener != null) {
                    onItemClickListener.onItemClick(items.get(position));
                }
            });
        }

        if (onItemLongClickListener != null) {
            holder.itemView.setOnLongClickListener(v -> {
                if (onItemLongClickListener != null) {
                    return onItemLongClickListener.onItemLongClick(items.get(position));
                }
                return false;
            });
        }
    }

onBindViewHolder(@nonnull ViewHolder holder, int position, @nonnull List payloads)内才会调用 onBindViewHolder(@nonnull ViewHolder holder, int position)。现在重写onBindViewHolder(@nonnull ViewHolder holder, int position, @nonnull List payloads),那么MultiTypeAdapter onBindViewHolder(@nonnull ViewHolder holder, int position)的意思是?

关于库代码的7点问题

1. 为什么要在application中注册

在application中少做事情是众所周知的事情,在app收到推送的时候,application会自动唤醒,也就是会执行注册工作,而这种工作在这种情况毫无意义

2. 为什么要分散定义

注册和使用本应该是在一起的,有内聚性,这种分开的方案弄得全部分散,做一件事情要到多个文件中进行,可读性差。java的混淆对于内聚性强的代码可以自动优化,而这种则完全不行。

静态注册的方式,如果你没有地方使用这个类型,但忘记手动删除注册的代码,混淆机制无法自动帮助你进行优化,总之这种设计思路显得十分的愚蠢。

如果是插件化或者组件化,item都是对application不可见的,是内部逻辑,故注册的逻辑不可行。

3. 布局和数据对应问题

布局和数据一对一这个就不进行讨论了,这是基础概念,单一数据对多个布局也很简单。

单一布局对应多个数据这其实有两种解决策略:

  • 做一个转换器(桥接器)对item这个java对象抹平数据差异
  • 复用layout这个xml文件,对不同数据用java层不同的item对象

4. 关于空状态

这个库将空状态提供出去让使用者使用这是一个很好的思路,但是有如下几点需要主义:

  • 空状态在有头部时的展示方式,emptyView高度应该是屏幕高度- 头部高度
  • 能否提供添加头部和底部的方法,addHeader()和addFooter()方法添加多个头
  • 能否提供动态移除头部和底部的方法,removeHeader(index)和removeFooter(index)

5. 关于库依赖的写法

2018年末,也就是今年末将不再支持compile的写法,建议库作者进行更换,而且尽量不要提供api的依赖方式。

一般提供开源库不需要提供exclude的方案,你仅仅需要将你不希望提供给使用者的recyclerView依赖变成comipleOnly的即可。

6. 关于ItemViewBinder的写法

ItemViewBinder理解上就是viewholder,做的一些事情。但他做了viewholder的定义和绑定工作,这里不建议这么做。这个使用起来其实很复杂的,建议在框架层面将viewholder的绑定工作做好,这里仅仅做view的findview和setAttr即可。

7.关于方法引用

ReadMe中提到:

这里通过Java8的特性传递方法的引用,再通过KeyGenerator执行这个方法获取数据对应的值来解决这个问题的。

这个在代码中没有找到具体的实现,想了解下实现的策略,如果是java8的特性,那么引入到java6的工程中是否需要做任何配置处理,还望具体告知,谢谢。

多语言支持

非常感谢这么好的库,能不能支持多语言?或者能在外面替换?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.