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, 作数据, 可以给一个数据插入和数据更新的例子吗?