本文参考 Android – RecyclerView(超简单)实现可展开列表修改而来,主要是记录下方便日后查看,在此基础上针对自身需求做的改变,主要解决一下几个问题。
- 这是个可展开列表的RecycleView
- 二级列表数据动态获取
- 优化原文中获取原始一级列表位置方式
效果如下
Demo
另外由于我的页面包含gridview和recycleview是放在scrollview中,所以又参考 PullToRefresh这个库实现了加载更多的功能,这个库可以比较方便的把加载更多的功能加进去,但是考虑到其他人使用的时候可能没有这种场景所以并没有把加载更多的代码加进去。
如果需要加载更多和刷新的可以去找个XRercycleView的控件,这种也蛮多的。
——————————————-
使用中发现点击最后一个一级节点 不会拉出子项来显示
修改MainActivity,在oncreat中增加一个方法
treeAdapter.setOnScrollListener(new TreeAdapter.OnScrollListener() {
@Override
public void scrollTo(int pos) {
treeRecycleView.smoothScrollToPosition(pos);
}
});
修改TreeAdapter itemClickListener附近的代码,主要是增加addLeaf来计算添加的叶子的总数,然后计算是否是点击的是最后一个
int addleaf;//添加的叶子数
private ItemClickListener itemClickListener = new ItemClickListener() {
@Override
public void onExpandChildren(TreeBean bean, int realPosition) {
int position = dataBeanList.lastIndexOf(bean);//确定当前点击的item位置
List<TreeBean> rdblist = getLeafData(position);
//获取要展示的子布局数据对象,注意区分onHideChildren方法中的getChildBean()。
if (rdblist == null || rdblist.size() == 0) {
return;
}
addleaf = addleaf + rdblist.size();
for (int i = rdblist.size() - 1; i > -1; i--) {
add(rdblist.get(i), position + 1);//在当前的item下方插入
}
if (realPosition == dataBeanList.size() - addleaf - 1 && mOnScrollListener != null) { //如果点击的item为最后一个
mOnScrollListener.scrollTo(position + 1);//向下滚动一个,使子布局能够完全展示
}
dataBeanList.get(position).setTreeBeanList(rdblist);
}
@Override
public void onHideChildren(TreeBean bean) {
int position = dataBeanList.lastIndexOf(bean);//确定当前点击的item位置
List<TreeBean> children = bean.getTreeBeanList();//获取子布局对象
if (children == null) {
return;
}
addleaf = addleaf - children.size();
for (int i = 1; i < children.size() + 1; i++) {
remove(position + 1);//删除
}
if (mOnScrollListener != null) {
mOnScrollListener.scrollTo(position);
}
}
};