GithubHelp home page GithubHelp logo

如果有这样一个列表,他里面的某一个字段是用来标识 itemType,我用这个库应该怎么去适配 about multitype HOT 15 CLOSED

drakeet avatar drakeet commented on May 19, 2024
如果有这样一个列表,他里面的某一个字段是用来标识 itemType,我用这个库应该怎么去适配

from multitype.

Comments (15)

drakeet avatar drakeet commented on May 19, 2024 4

我在 sample 中提供了一个 one2many 示例,讲解的就是如何通过一个整形 int type 字段来区分 items,没有 gson 序列化拦截,没有复杂的处理逻辑,各位可以再看看:
https://github.com/drakeet/MultiType/tree/master/sample/src/main/java/me/drakeet/multitype/sample/one2many
@burgessjp @lizhangqu @lixi0912

from multitype.

lixi0912 avatar lixi0912 commented on May 19, 2024 1
  1. 不改源码的话,就是创建在包一层,具体可以参考 Message - MessageContent 的包装
    传送门: TimeMachine

  2. 修改源码的话~

    a) 修改 MultiPool 的机制,将两个 Array 替换成 SparseArrayCompat,由 viewType 去对应 viewProvider。
    b) 修改 MultiTypeAdapter

from multitype.

drakeet avatar drakeet commented on May 19, 2024

感谢 @lixi0912 帮忙解答!

题主这是需要定制二层分发的需求,在 MultiType 2.0 提供了 FlatTypeAdapter 用于扁平化二级 index, example by TimeMachine:

public class MessageAdapter extends MultiTypeAdapter {

    public MessageAdapter(@NonNull List<Message> messages) {
        super(messages);
    }

    @NonNull @Override public Class onFlattenClass(@NonNull Item message) {
        return ((Message) message).content.getClass();
    }
}

onFlattenClass 接口方法中,可以对 Item 判断是否进行二级定位。

from multitype.

burgessjp avatar burgessjp commented on May 19, 2024

大概懂了。
是不是大概是这样的:还是以NewsItem来说,数据结构大致是这样的,

public class NewsItem implements Item
{
   public String title;
   public String content;
   public int itemType
}

比如说我有3个不同的itemType,就需要去新建3个不同的类去继承于NewsItem,然后重写MultiTypeAdapter 中的onFlattenClass去根据itemType去得到相应的子类,是吗?

from multitype.

drakeet avatar drakeet commented on May 19, 2024

不是这样,我的 Message - Content 不是继承关系,而是包含、组合关系

from multitype.

drakeet avatar drakeet commented on May 19, 2024

你的数据结构比较令人混乱不清,你可以重新理清楚一下。

from multitype.

burgessjp avatar burgessjp commented on May 19, 2024

数据结构没问题,我知道你的Message - Content 是包含、组合关系,我这里和你那个有点不同,问题我更新了下。

from multitype.

drakeet avatar drakeet commented on May 19, 2024

我明白了,你的做法很聪明!如果你已经这么做了:

新建 3 个不同的类去继承于 NewsItem

那么是可以如此:

@NonNull @Override public Class onFlattenClass(@NonNull Item item) {
    if (item.type == 1) {
        return ItemOne.class;
    } else if (item.type == 2) {
        return ItemTwo.class;
    }
    ...
}

from multitype.

burgessjp avatar burgessjp commented on May 19, 2024

那就差不多知道了,我也是看你的这个库设计的很精妙,准备用到项目中去,谢谢你的解答。

from multitype.

drakeet avatar drakeet commented on May 19, 2024

不过话说回来,你的需求还是略奇怪,哈哈,怎么会有这样的需求呢(思考状...

我这个小库子也是极力追求清晰、简单和灵活,能不做过多封装就不做,你看不到什么空白页、什么 Header View、下拉刷新等等封装。所以其实它的代码很容易读懂也能很快读完,因此,如果有什么没有提供的功能,或想自定义成更加简单的方式(大多情况,更加简单意味着灵活性的丢失),大可随意、大胆地去继承各个类进行拓展和实现——由于它的精巧设计,这么做通常是很直接和容易的,这是原本就留出来的。

from multitype.

burgessjp avatar burgessjp commented on May 19, 2024

我现在遇到的基本都是这种,我感觉这是很常规的做法,可能是我习惯了,哈哈。准备去拜读一下你的TimeMachine了。

from multitype.

lizhangqu avatar lizhangqu commented on May 19, 2024
@NonNull @Override public Class onFlattenClass(@NonNull Item item) {
    if (item.type == 1) {
        return ItemOne.class;
    } else if (item.type == 2) {
        return ItemTwo.class;
    }
    ...
}

@drakeet 这段代码是有问题的,会存在一个不能转型的异常。
而且这种数据结构是很正常的

public class MessageItem
{
   public String title;
   public String content;
   public int roleType
}

根据roleType判断使用哪种布局

from multitype.

drakeet avatar drakeet commented on May 19, 2024

onFlattenClass 不应该做数据类型分发而应该用来做数据扁平化。

from multitype.

lizhangqu avatar lizhangqu commented on May 19, 2024
@Override
    public WeiboContent deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
        throws JsonParseException {
        Gson gson = GsonProvider.gson;
        JsonObject jsonObject = (JsonObject) json;
        final String contentType = stringOrEmpty(jsonObject.get("content_type"));
        WeiboContent content = null;
        if (contentType.equals(SimpleText.TYPE)) {
            content = gson.fromJson(json, SimpleText.class);
        } else if (contentType.equals(SimpleImage.TYPE)) {
            content = gson.fromJson(json, SimpleImage.class);
        }
        return content;
    }

这种方式,是在反序列化的时候处理掉,在用gson的时候,会显得很方便,但是使用fastjson时,分type解析显得有点过于麻烦,往往有时候需要解析两次,会不合理。

from multitype.

drakeet avatar drakeet commented on May 19, 2024

那只能怪 fastjson,如果硬要使用 fastjson,那就考虑不要采用这种抽象嵌套设计。另外,有问题欢迎开 issue,不要在这个 issue 下讨论无关主题的内容,保持纯粹。

from multitype.

Related Issues (20)

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.