weixin_31368091 2020-06-20 16:37 采纳率: 0%
浏览 173

recyclerview 多层数据结构

recyclerview 支持多层数据结构

请问一下, 这些数据结构是需要写成一个 LIST 吗, 比如, 我需要写一个记账类
按月份分组, 然后按日期分组

List mDataList
mDataList.add(new Month(xx))
mDataList.add(new Day(xxx))
mDataList.add(new Item(xx))
mDataList.add(new Item(xx))
....

我现在在使用以下格式通用类 (recyclerview item = rvItem), 感觉使用起来非常不方便,特别是增加一项新的内容时, 需要手动去查找.
由于每一条记录自动更新 day 及 month 的求和,导致每改一条记录, 都要对 group 进行更新.

RvItem

public abstract class RvItem implements Comparable<RvItem> {
    public float oldData, in, out;

    public abstract int getLayoutId();
    public abstract int getComparableNum();
    public abstract float getAmount(); 

    @Override
    public int compareTo(RvItem o) {
        return getComparableNum() - o.getComparableNum();
    }
}

RvChild

public abstract class RvChild extends RvItem{
    public float oldValue;  //this is special for revision
    public RvGroup mGroup;
    public RvSection mSection;
    public RvHeader mHeader;

    public void addToGroup(RvGroup group) {
        group.addChild(this);

    }

    public void addToSection(RvSection section) {
        section.addChild(this);
    }

    public void addToHeader(RvHeader header) {
        header.addChild(this);
    }

    public void destroy() {
        mGroup.removeChild(this);

        if(mSection != null) {
            mSection.removeChild(this);
        }

        if(mHeader != null) {
            mHeader.removeChild(this);
        }
    }

}

RvGroup

public abstract class RvGroup extends RvItem {
    public boolean isExpanded = true;

    //public float mSumIn, mSumOut;
    public RvSection mSection;

    private List<RvChild> childList;

    public abstract boolean isMyMember(RvChild child);

    public RvGroup() {
        childList = new ArrayList<>();
    }

    public List<RvChild> getChildList() {
        return childList;
    }

    public int getChildCount() {
        return childList == null ? 0 : childList.size();
    }

    public void addChild(RvChild child) {
        child.mGroup = this;

        boolean isFound = false;
        for(int i=0; i<childList.size(); i++) {
            if(child.compareTo(childList.get(i)) > 0) {
                childList.add(i, child);
                isFound = true;
                break;
            }
        }
        if(!isFound) {
            childList.add(child);
        }
        in += child.in; 
        out += child.out;
    }

    public void addChildAll(List<RvChild> items) {
        for(RvChild child : items) {
            addChild(child);
        }
        Collections.sort(childList, Collections.reverseOrder());
    }

    public void removeChild(RvChild child) {
        child.mGroup = null;
        childList.remove(child);

        in -= child.in; out -= child.out;
    }

    public void removeChildAll(List<RvChild> children) {
        for(RvChild child : children) {
            removeChild(child);
        }
    }

    @Override
    public float getAmount() {
        return in + out;
//      return mSumIn + mSumOut;
    }

    public void addToSection(RvSection section) {
        section.addGroup(this);
    }

}

然后写成一个 List mData, 里面按 getComparableNum() 指定的顺序来排序, 组成一个完整的, 包含 group, child 的数据.

但是有几个问题,
1. 这样的数据合理吗? 有没有更好的数据结构
2. 这样的数据在某天插入一个新的数据时, 需要手动去找它应该在的位置,
3. 看到有些人用 Entity, 作数据, 可以给一个数据插入和数据更新的例子吗?

  • 写回答

1条回答

  • lht80s 2020-07-03 12:02
    关注

    首先数据结构肯定不合理,其实你只要一个RvItem就好,月、日等等都作为其中的成员变量就是了。
    至于显示的方式,那是Adapter的事,别从数据源入手,数据量一多,会anr的

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题