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个回答

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐