Android开发折叠列表BaseNodeAdapter的使用

Android项目开发过程中,经常会有多级列表的需求,今天分享一下简单好用的BaseNodeAdapter,利用此适配器可实现效果

先看一下最终效果

折叠列表展示

将此适配器集成至项目

1.在项目的根目录的build.gradle文件中配置远程仓库

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

2.在需要使用该功能的module中添加依赖,版本号可用(3.0.4)

dependencies {
        compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:VERSION_CODE'
}

这样就集成完毕了,此框架不仅仅有折叠布局的功能,普通的线性列表布局也可用

使用

1.首先创建适配器的实体类(这是个五级的列表,可能代码有些长)

public class DeptListBean {
    private String code;
    private String msg;
    private DataBean data;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public DataBean getData() {
        return data;
    }

    public void setData(DataBean data) {
        this.data = data;
    }

    public static class DataBean {
        private List<ListBeanXXXX> list;

        public List<ListBeanXXXX> getList() {
            return list;
        }

        public void setList(List<ListBeanXXXX> list) {
            this.list = list;
        }

        public static class ListBeanXXXX extends BaseExpandNode {
            private String deptId;
            private String deptName;
            private String orgId;
            private String precinctId;
            private Object precinctName;
            private String parentDeptId;
            private Object parentDeptName;
            private String remark;
            private int status;
            private Object createTime;
            private Object createUserId;
            private Object updateTime;
            private Object updateUserId;
            private List<ListBeanXXX> list;

            public String getDeptId() {
                return deptId;
            }

            public void setDeptId(String deptId) {
                this.deptId = deptId;
            }

            public String getDeptName() {
                return deptName;
            }

            public void setDeptName(String deptName) {
                this.deptName = deptName;
            }

            public String getOrgId() {
                return orgId;
            }

            public void setOrgId(String orgId) {
                this.orgId = orgId;
            }

            public String getPrecinctId() {
                return precinctId;
            }

            public void setPrecinctId(String precinctId) {
                this.precinctId = precinctId;
            }

            public Object getPrecinctName() {
                return precinctName;
            }

            public void setPrecinctName(Object precinctName) {
                this.precinctName = precinctName;
            }

            public String getParentDeptId() {
                return parentDeptId;
            }

            public void setParentDeptId(String parentDeptId) {
                this.parentDeptId = parentDeptId;
            }

            public Object getParentDeptName() {
                return parentDeptName;
            }

            public void setParentDeptName(Object parentDeptName) {
                this.parentDeptName = parentDeptName;
            }

            public String getRemark() {
                return remark;
            }

            public void setRemark(String remark) {
                this.remark = remark;
            }

            public int getStatus() {
                return status;
            }

            public void setStatus(int status) {
                this.status = status;
            }

            public Object getCreateTime() {
                return createTime;
            }

            public void setCreateTime(Object createTime) {
                this.createTime = createTime;
            }

            public Object getCreateUserId() {
                return createUserId;
            }

            public void setCreateUserId(Object createUserId) {
                this.createUserId = createUserId;
            }

            public Object getUpdateTime() {
                return updateTime;
            }

            public void setUpdateTime(Object updateTime) {
                this.updateTime = updateTime;
            }

            public Object getUpdateUserId() {
                return updateUserId;
            }

            public void setUpdateUserId(Object updateUserId) {
                this.updateUserId = updateUserId;
            }

            public List<ListBeanXXX> getList() {
                return list;
            }

            public void setList(List<ListBeanXXX> list) {
                this.list = list;
            }

            private List<BaseNode> childNode;

            public void addChildNode(BaseNode baseNode) {
                if (baseNode == null) {
                    return;
                }
                if (childNode == null) {
                    childNode = new ArrayList<>();
                }
                childNode.add(baseNode);
            }

            @Nullable
            @Override
            public List<BaseNode> getChildNode() {
                return childNode;
            }

            public static class ListBeanXXX extends BaseExpandNode {
        
                private String deptId;
                private String deptName;
                private String orgId;
                private String precinctId;
                private Object precinctName;
                private String parentDeptId;
                private Object parentDeptName;
                private Object remark;
                private int status;
                private Object createTime;
                private Object createUserId;
                private String updateTime;
                private Object updateUserId;
                private List<ListBeanXX> list;

                public String getDeptId() {
                    return deptId;
                }

                public void setDeptId(String deptId) {
                    this.deptId = deptId;
                }

                public String getDeptName() {
                    return deptName;
                }

                public void setDeptName(String deptName) {
                    this.deptName = deptName;
                }

                public String getOrgId() {
                    return orgId;
                }

                public void setOrgId(String orgId) {
                    this.orgId = orgId;
                }

                public String getPrecinctId() {
                    return precinctId;
                }

                public void setPrecinctId(String precinctId) {
                    this.precinctId = precinctId;
                }

                public Object getPrecinctName() {
                    return precinctName;
                }

                public void setPrecinctName(Object precinctName) {
                    this.precinctName = precinctName;
                }

                public String getParentDeptId() {
                    return parentDeptId;
                }

                public void setParentDeptId(String parentDeptId) {
                    this.parentDeptId = parentDeptId;
                }

                public Object getParentDeptName() {
                    return parentDeptName;
                }

                public void setParentDeptName(Object parentDeptName) {
                    this.parentDeptName = parentDeptName;
                }

                public Object getRemark() {
                    return remark;
                }

                public void setRemark(Object remark) {
                    this.remark = remark;
                }

                public int getStatus() {
                    return status;
                }

                public void setStatus(int status) {
                    this.status = status;
                }

                public Object getCreateTime() {
                    return createTime;
                }

                public void setCreateTime(Object createTime) {
                    this.createTime = createTime;
                }

                public Object getCreateUserId() {
                    return createUserId;
                }

                public void setCreateUserId(Object createUserId) {
                    this.createUserId = createUserId;
                }

                public String getUpdateTime() {
                    return updateTime;
                }

                public void setUpdateTime(String updateTime) {
                    this.updateTime = updateTime;
                }

                public Object getUpdateUserId() {
                    return updateUserId;
                }

                public void setUpdateUserId(Object updateUserId) {
                    this.updateUserId = updateUserId;
                }

                public List<ListBeanXX> getList() {
                    return list;
                }

                public void setList(List<ListBeanXX> list) {
                    this.list = list;
                }

                private List<BaseNode> childNode;

                public void addChildNode(BaseNode baseNode) {
                    if (baseNode == null) {
                        return;
                    }
                    if (childNode == null) {
                        childNode = new ArrayList<>();
                    }
                    childNode.add(baseNode);
                }

                @Nullable
                @Override
                public List<BaseNode> getChildNode() {
                    return childNode;
                }

                public static class ListBeanXX extends BaseExpandNode {
                
                    private String deptId;
                    private String deptName;
                    private String orgId;
                    private String precinctId;
                    private Object precinctName;
                    private String parentDeptId;
                    private Object parentDeptName;
                    private String remark;
                    private int status;
                    private String createTime;
                    private String createUserId;
                    private String updateTime;
                    private String updateUserId;
                    private List<ListBeanX> list;

                    public String getDeptId() {
                        return deptId;
                    }

                    public void setDeptId(String deptId) {
                        this.deptId = deptId;
                    }

                    public String getDeptName() {
                        return deptName;
                    }

                    public void setDeptName(String deptName) {
                        this.deptName = deptName;
                    }

                    public String getOrgId() {
                        return orgId;
                    }

                    public void setOrgId(String orgId) {
                        this.orgId = orgId;
                    }

                    public String getPrecinctId() {
                        return precinctId;
                    }

                    public void setPrecinctId(String precinctId) {
                        this.precinctId = precinctId;
                    }

                    public Object getPrecinctName() {
                        return precinctName;
                    }

                    public void setPrecinctName(Object precinctName) {
                        this.precinctName = precinctName;
                    }

                    public String getParentDeptId() {
                        return parentDeptId;
                    }

                    public void setParentDeptId(String parentDeptId) {
                        this.parentDeptId = parentDeptId;
                    }

                    public Object getParentDeptName() {
                        return parentDeptName;
                    }

                    public void setParentDeptName(Object parentDeptName) {
                        this.parentDeptName = parentDeptName;
                    }

                    public String getRemark() {
                        return remark;
                    }

                    public void setRemark(String remark) {
                        this.remark = remark;
                    }

                    public int getStatus() {
                        return status;
                    }

                    public void setStatus(int status) {
                        this.status = status;
                    }

                    public String getCreateTime() {
                        return createTime;
                    }

                    public void setCreateTime(String createTime) {
                        this.createTime = createTime;
                    }

                    public String getCreateUserId() {
                        return createUserId;
                    }

                    public void setCreateUserId(String createUserId) {
                        this.createUserId = createUserId;
                    }

                    public String getUpdateTime() {
                        return updateTime;
                    }

                    public void setUpdateTime(String updateTime) {
                        this.updateTime = updateTime;
                    }

                    public String getUpdateUserId() {
                        return updateUserId;
                    }

                    public void setUpdateUserId(String updateUserId) {
                        this.updateUserId = updateUserId;
                    }

                    public List<ListBeanX> getList() {
                        return list;
                    }

                    public void setList(List<ListBeanX> list) {
                        this.list = list;
                    }

                    private List<BaseNode> childNode;

                    public void addChildNode(BaseNode baseNode) {
                        if (baseNode == null) {
                            return;
                        }
                        if (childNode == null) {
                            childNode = new ArrayList<>();
                        }
                        childNode.add(baseNode);
                    }

                    @Nullable
                    @Override
                    public List<BaseNode> getChildNode() {
                        return childNode;
                    }

                    public static class ListBeanX extends BaseExpandNode {
                       
                        private String deptId;
                        private String deptName;
                        private String orgId;
                        private String precinctId;
                        private Object precinctName;
                        private String parentDeptId;
                        private Object parentDeptName;
                        private String remark;
                        private int status;
                        private String createTime;
                        private String createUserId;
                        private String updateTime;
                        private String updateUserId;
                        private List<ListBean> list;

                        public String getDeptId() {
                            return deptId;
                        }

                        public void setDeptId(String deptId) {
                            this.deptId = deptId;
                        }

                        public String getDeptName() {
                            return deptName;
                        }

                        public void setDeptName(String deptName) {
                            this.deptName = deptName;
                        }

                        public String getOrgId() {
                            return orgId;
                        }

                        public void setOrgId(String orgId) {
                            this.orgId = orgId;
                        }

                        public String getPrecinctId() {
                            return precinctId;
                        }

                        public void setPrecinctId(String precinctId) {
                            this.precinctId = precinctId;
                        }

                        public Object getPrecinctName() {
                            return precinctName;
                        }

                        public void setPrecinctName(Object precinctName) {
                            this.precinctName = precinctName;
                        }

                        public String getParentDeptId() {
                            return parentDeptId;
                        }

                        public void setParentDeptId(String parentDeptId) {
                            this.parentDeptId = parentDeptId;
                        }

                        public Object getParentDeptName() {
                            return parentDeptName;
                        }

                        public void setParentDeptName(Object parentDeptName) {
                            this.parentDeptName = parentDeptName;
                        }

                        public String getRemark() {
                            return remark;
                        }

                        public void setRemark(String remark) {
                            this.remark = remark;
                        }

                        public int getStatus() {
                            return status;
                        }

                        public void setStatus(int status) {
                            this.status = status;
                        }

                        public String getCreateTime() {
                            return createTime;
                        }

                        public void setCreateTime(String createTime) {
                            this.createTime = createTime;
                        }

                        public String getCreateUserId() {
                            return createUserId;
                        }

                        public void setCreateUserId(String createUserId) {
                            this.createUserId = createUserId;
                        }

                        public String getUpdateTime() {
                            return updateTime;
                        }

                        public void setUpdateTime(String updateTime) {
                            this.updateTime = updateTime;
                        }

                        public String getUpdateUserId() {
                            return updateUserId;
                        }

                        public void setUpdateUserId(String updateUserId) {
                            this.updateUserId = updateUserId;
                        }

                        public List<ListBean> getList() {
                            return list;
                        }

                        public void setList(List<ListBean> list) {
                            this.list = list;
                        }

                        private List<BaseNode> childNode;

                        public void addChildNode(BaseNode baseNode) {
                            if (baseNode == null) {
                                return;
                            }
                            if (childNode == null) {
                                childNode = new ArrayList<>();
                            }
                            childNode.add(baseNode);
                        }

                        @Nullable
                        @Override
                        public List<BaseNode> getChildNode() {
                            return childNode;
                        }

                        public static class ListBean extends BaseExpandNode{
                            
                            private String deptId;
                            private String deptName;
                            private String orgId;
                            private String precinctId;
                            private Object precinctName;
                            private String parentDeptId;
                            private Object parentDeptName;
                            private String remark;
                            private int status;
                            private String createTime;
                            private String createUserId;
                            private String updateTime;
                            private String updateUserId;

                            public String getDeptId() {
                                return deptId;
                            }

                            public void setDeptId(String deptId) {
                                this.deptId = deptId;
                            }

                            public String getDeptName() {
                                return deptName;
                            }

                            public void setDeptName(String deptName) {
                                this.deptName = deptName;
                            }

                            public String getOrgId() {
                                return orgId;
                            }

                            public void setOrgId(String orgId) {
                                this.orgId = orgId;
                            }

                            public String getPrecinctId() {
                                return precinctId;
                            }

                            public void setPrecinctId(String precinctId) {
                                this.precinctId = precinctId;
                            }

                            public Object getPrecinctName() {
                                return precinctName;
                            }

                            public void setPrecinctName(Object precinctName) {
                                this.precinctName = precinctName;
                            }

                            public String getParentDeptId() {
                                return parentDeptId;
                            }

                            public void setParentDeptId(String parentDeptId) {
                                this.parentDeptId = parentDeptId;
                            }

                            public Object getParentDeptName() {
                                return parentDeptName;
                            }

                            public void setParentDeptName(Object parentDeptName) {
                                this.parentDeptName = parentDeptName;
                            }

                            public String getRemark() {
                                return remark;
                            }

                            public void setRemark(String remark) {
                                this.remark = remark;
                            }

                            public int getStatus() {
                                return status;
                            }

                            public void setStatus(int status) {
                                this.status = status;
                            }

                            public String getCreateTime() {
                                return createTime;
                            }

                            public void setCreateTime(String createTime) {
                                this.createTime = createTime;
                            }

                            public String getCreateUserId() {
                                return createUserId;
                            }

                            public void setCreateUserId(String createUserId) {
                                this.createUserId = createUserId;
                            }

                            public String getUpdateTime() {
                                return updateTime;
                            }

                            public void setUpdateTime(String updateTime) {
                                this.updateTime = updateTime;
                            }

                            public String getUpdateUserId() {
                                return updateUserId;
                            }

                            public void setUpdateUserId(String updateUserId) {
                                this.updateUserId = updateUserId;
                            }

                            @Nullable
                            @Override
                            public List<BaseNode> getChildNode() {
                                return null;
                            }
                        }
                    }
                }
            }
        }
    }
}

关键事项:
a.可展开的一层 extends BaseExpandNode
b.声明子列表的BaseNode: private List childNode;
c.设置添加子列表的addChildNode方法

public void addChildNode(BaseNode baseNode) {
                if (baseNode == null) {
                    return;
                }
                if (childNode == null) {
                    childNode = new ArrayList<>();
                }
                childNode.add(baseNode);
            }

d.设置获取子列表的方法          

  @Nullable
  @Override
  public List<BaseNode> getChildNode() {
      return childNode;
  }

2.创建Adapter和相应的层级Provider

public class DeptListShowAdapter extends BaseNodeAdapter {
    public static final int EXPAND_COLLAPSE_PAYLOAD = 110;

    public List<BaseNode> getUsedData(DeptListBean.DataBean dataBean) {
        List<BaseNode> data = new ArrayList<>();
        for (int i = 0; i < dataBean.getList().size(); i++) {
            DeptListBean.DataBean.ListBeanXXXX listBeanXXXX = dataBean.getList().get(i);
            for (int j = 0; j < listBeanXXXX.getList().size(); j++) {
                DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX listBeanXXX = listBeanXXXX.getList().get(j);
                for (int k = 0; k < listBeanXXX.getList().size(); k++) {
                    DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX listBeanXX = listBeanXXX.getList().get(k);
                    for (int l = 0; l < listBeanXX.getList().size(); l++) {
                        DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX.ListBeanX listBeanX = listBeanXX.getList().get(l);
                        for (int m = 0; m < listBeanX.getList().size(); m++) {
                            DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX.ListBeanX.ListBean listBean = listBeanX.getList().get(m);
                            listBeanX.addChildNode(listBean);
                        }
                        listBeanXX.addChildNode(listBeanX);
                    }
                    listBeanXXX.addChildNode(listBeanXX);
                }
                listBeanXXXX.addChildNode(listBeanXXX);
            }
            data.add(listBeanXXXX);
        }
        return data;
    }

    public DeptListShowAdapter() {
        addFullSpanNodeProvider(new FirstProvider());
        addFullSpanNodeProvider(new SecondProvider());
        addFullSpanNodeProvider(new ThirdProvider());
        addFullSpanNodeProvider(new FourthProvider());
        addNodeProvider(new FifthProvider());
        addChildClickViewIds(R.id.rl_to_detail);
    }

    @Override
    protected int getItemType(@NotNull List<? extends BaseNode> list, int i) {
        BaseNode node = list.get(i);
        if (node instanceof DeptListBean.DataBean.ListBeanXXXX) {
            return 0;
        } else if (node instanceof DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX) {
            return 1;
        } else if (node instanceof DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX) {
            return 2;
        } else if (node instanceof DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX.ListBeanX) {
            return 3;
        } else if (node instanceof DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX.ListBeanX.ListBean) {
            return 4;
        }
        return -1;
    }

    public class FirstProvider extends BaseNodeProvider {

        @Override
        public int getItemViewType() {
            return 0;
        }

        @Override
        public int getLayoutId() {
            return R.layout.item_node_dept_first;
        }

        @Override
        public void convert(@NotNull BaseViewHolder baseViewHolder, @Nullable BaseNode baseNode) {
            DeptListBean.DataBean.ListBeanXXXX bean = (DeptListBean.DataBean.ListBeanXXXX) baseNode;
            baseViewHolder.setText(R.id.tv_tittle, bean.getDeptName());
            ImageView ivTag = baseViewHolder.getView(R.id.iv_tag);
            if (bean.getChildNode() == null || bean.getChildNode().size() == 0) {
                ivTag.setImageResource(R.drawable.ic_txl_jg);
            } else {
                ivTag.setImageResource(R.drawable.ic_dfp_bm_zk);
            }
        }

        @Override
        public void convert(@NotNull BaseViewHolder helper, @NotNull BaseNode data, @NotNull List<?> payloads) {
            DeptListBean.DataBean.ListBeanXXXX bean = (DeptListBean.DataBean.ListBeanXXXX) data;
            if (bean.getChildNode() == null || bean.getChildNode().size() == 0) {
                return;
            }
            for (Object payload : payloads) {
                if (payload instanceof Integer && (int) payload == EXPAND_COLLAPSE_PAYLOAD) {
                    // 增量刷新,使用动画变化箭头
                    setArrowSpin(helper, data, true);
                }
            }
        }

        private void setArrowSpin(BaseViewHolder helper, BaseNode data, boolean isAnimate) {
            DeptListBean.DataBean.ListBeanXXXX bean = (DeptListBean.DataBean.ListBeanXXXX) data;
            ImageView imageView = helper.getView(R.id.iv_tag);
            if (bean.isExpanded()) {
                if (isAnimate) {
                    ViewCompat.animate(imageView).setDuration(200)
                            .setInterpolator(new DecelerateInterpolator())
                            .rotation(0f)
                            .start();
                } else {
                    imageView.setRotation(0f);
                }
            } else {
                if (isAnimate) {
                    ViewCompat.animate(imageView).setDuration(200)
                            .setInterpolator(new DecelerateInterpolator())
                            .rotation(-90f)
                            .start();
                } else {
                    imageView.setRotation(-90f);
                }
            }
        }

        @Override
        public void onClick(@NotNull BaseViewHolder helper, @NotNull View view, BaseNode data, int position) {
//            getAdapter().expandOrCollapse(position);
//            switch (view.getId()) {
//                case R.id.rl_tag:
                    getAdapter().expandOrCollapse(position, true, true, EXPAND_COLLAPSE_PAYLOAD);
//                    break;
//            }
        }
    }

    public class SecondProvider extends BaseNodeProvider {

        @Override
        public int getItemViewType() {
            return 1;
        }

        @Override
        public int getLayoutId() {
            return R.layout.item_node_dept_second;
        }

        @Override
        public void convert(@NotNull BaseViewHolder baseViewHolder, @Nullable BaseNode baseNode) {
            DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX bean = (DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX) baseNode;
            baseViewHolder.setText(R.id.tv_tittle, bean.getDeptName());
            ImageView ivTag = baseViewHolder.getView(R.id.iv_tag);
            if (bean.getChildNode() == null || bean.getChildNode().size() == 0) {
                ivTag.setImageResource(R.drawable.ic_txl_jg);
            } else {
                ivTag.setImageResource(R.drawable.ic_dfp_bm_zk);
            }
        }

        @Override
        public void convert(@NotNull BaseViewHolder helper, @NotNull BaseNode data, @NotNull List<?> payloads) {
            DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX bean = (DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX) data;
            if (bean.getChildNode() == null || bean.getChildNode().size() == 0) {
                return;
            }
            for (Object payload : payloads) {
                if (payload instanceof Integer && (int) payload == EXPAND_COLLAPSE_PAYLOAD) {
                    // 增量刷新,使用动画变化箭头
                    setArrowSpin(helper, data, true);
                }
            }
        }

        private void setArrowSpin(BaseViewHolder helper, BaseNode data, boolean isAnimate) {
            DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX bean = (DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX) data;
            ImageView imageView = helper.getView(R.id.iv_tag);
            if (bean.isExpanded()) {
                if (isAnimate) {
                    ViewCompat.animate(imageView).setDuration(200)
                            .setInterpolator(new DecelerateInterpolator())
                            .rotation(0f)
                            .start();
                } else {
                    imageView.setRotation(0f);
                }
            } else {
                if (isAnimate) {
                    ViewCompat.animate(imageView).setDuration(200)
                            .setInterpolator(new DecelerateInterpolator())
                            .rotation(-90f)
                            .start();
                } else {
                    imageView.setRotation(-90f);
                }
            }
        }

        @Override
        public void onClick(@NotNull BaseViewHolder helper, @NotNull View view, BaseNode data, int position) {
//            getAdapter().expandOrCollapse(position);
//            switch (view.getId()) {
//                case R.id.iv_tag:
                    getAdapter().expandOrCollapse(position, true, true, EXPAND_COLLAPSE_PAYLOAD);
//                    break;
//            }
        }
    }

    public class ThirdProvider extends BaseNodeProvider {

        @Override
        public int getItemViewType() {
            return 2;
        }

        @Override
        public int getLayoutId() {
            return R.layout.item_node_dept_third;
        }

        @Override
        public void convert(@NotNull BaseViewHolder baseViewHolder, @Nullable BaseNode baseNode) {
            DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX bean = (DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX) baseNode;
            baseViewHolder.setText(R.id.tv_tittle, bean.getDeptName());
            ImageView ivTag = baseViewHolder.getView(R.id.iv_tag);
            if (bean.getChildNode() == null || bean.getChildNode().size() == 0) {
                ivTag.setImageResource(R.drawable.ic_txl_jg);
            } else {
                ivTag.setImageResource(R.drawable.ic_dfp_bm_zk);
            }
        }

        @Override
        public void convert(@NotNull BaseViewHolder helper, @NotNull BaseNode data, @NotNull List<?> payloads) {
            DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX bean = (DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX) data;
            if (bean.getChildNode() == null || bean.getChildNode().size() == 0) {
                return;
            }
            for (Object payload : payloads) {
                if (payload instanceof Integer && (int) payload == EXPAND_COLLAPSE_PAYLOAD) {
                    // 增量刷新,使用动画变化箭头
                    setArrowSpin(helper, data, true);
                }
            }
        }

        private void setArrowSpin(BaseViewHolder helper, BaseNode data, boolean isAnimate) {
            DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX bean = (DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX) data;
            ImageView imageView = helper.getView(R.id.iv_tag);
            if (bean.isExpanded()) {
                if (isAnimate) {
                    ViewCompat.animate(imageView).setDuration(200)
                            .setInterpolator(new DecelerateInterpolator())
                            .rotation(0f)
                            .start();
                } else {
                    imageView.setRotation(0f);
                }
            } else {
                if (isAnimate) {
                    ViewCompat.animate(imageView).setDuration(200)
                            .setInterpolator(new DecelerateInterpolator())
                            .rotation(-90f)
                            .start();
                } else {
                    imageView.setRotation(-90f);
                }
            }
        }

        @Override
        public void onClick(@NotNull BaseViewHolder helper, @NotNull View view, BaseNode data, int position) {
//            getAdapter().expandOrCollapse(position);
//            switch (view.getId()) {
//                case R.id.iv_tag:
                    getAdapter().expandOrCollapse(position, true, true, EXPAND_COLLAPSE_PAYLOAD);
//                    break;
//            }
        }
    }

    public class FourthProvider extends BaseNodeProvider {

        @Override
        public int getItemViewType() {
            return 3;
        }

        @Override
        public int getLayoutId() {
            return R.layout.item_node_dept_fourth;
        }

        @Override
        public void convert(@NotNull BaseViewHolder baseViewHolder, @Nullable BaseNode baseNode) {
            DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX.ListBeanX bean = (DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX.ListBeanX) baseNode;
            baseViewHolder.setText(R.id.tv_tittle, bean.getDeptName());
            ImageView ivTag = baseViewHolder.getView(R.id.iv_tag);
            if (bean.getChildNode() == null || bean.getChildNode().size() == 0) {
                ivTag.setImageResource(R.drawable.ic_txl_jg);
            } else {
                ivTag.setImageResource(R.drawable.ic_dfp_bm_zk);
            }
        }

        @Override
        public void convert(@NotNull BaseViewHolder helper, @NotNull BaseNode data, @NotNull List<?> payloads) {
            DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX.ListBeanX bean = (DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX.ListBeanX) data;
            if (bean.getChildNode() == null || bean.getChildNode().size() == 0) {
                return;
            }
            for (Object payload : payloads) {
                if (payload instanceof Integer && (int) payload == EXPAND_COLLAPSE_PAYLOAD) {
                    // 增量刷新,使用动画变化箭头
                    setArrowSpin(helper, data, true);
                }
            }
        }

        private void setArrowSpin(BaseViewHolder helper, BaseNode data, boolean isAnimate) {
            DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX.ListBeanX bean = (DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX.ListBeanX) data;
            ImageView imageView = helper.getView(R.id.iv_tag);
            if (bean.isExpanded()) {
                if (isAnimate) {
                    ViewCompat.animate(imageView).setDuration(200)
                            .setInterpolator(new DecelerateInterpolator())
                            .rotation(0f)
                            .start();
                } else {
                    imageView.setRotation(0f);
                }
            } else {
                if (isAnimate) {
                    ViewCompat.animate(imageView).setDuration(200)
                            .setInterpolator(new DecelerateInterpolator())
                            .rotation(-90f)
                            .start();
                } else {
                    imageView.setRotation(-90f);
                }
            }
        }

        @Override
        public void onClick(@NotNull BaseViewHolder helper, @NotNull View view, BaseNode data, int position) {
//            getAdapter().expandOrCollapse(position);
//            switch (view.getId()) {
//                case R.id.iv_tag:
                    getAdapter().expandOrCollapse(position, true, true, EXPAND_COLLAPSE_PAYLOAD);
//                    break;
//            }
        }
    }

    public class FifthProvider extends BaseNodeProvider {

        @Override
        public int getItemViewType() {
            return 4;
        }

        @Override
        public int getLayoutId() {
            return R.layout.item_node_dept_fifth;
        }

        @Override
        public void convert(@NotNull BaseViewHolder baseViewHolder, @Nullable BaseNode baseNode) {
            DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX.ListBeanX.ListBean bean = (DeptListBean.DataBean.ListBeanXXXX.ListBeanXXX.ListBeanXX.ListBeanX.ListBean) baseNode;
            baseViewHolder.setText(R.id.tv_tittle, bean.getDeptName());

        }

        @Override
        public void onClick(@NotNull BaseViewHolder helper, @NotNull View view, BaseNode data, int position) {
        }
    }
}

3.在Acitivity中的使用

声明

var deptListShowAdapter = DeptListShowAdapter()

配置

rv_list.layoutManager = LinearLayoutManager(this)
rv_list.adapter = deptListShowAdapter
deptListShowAdapter.setList(deptListShowAdapter.getUsedData(data))

点击事件
注意:子控件的点击事件需要调用适配器的添加子控件点击功能的方法

  addChildClickViewIds(R.id.rl_to_detail);

整体点击与子控件点击

 deptListShowAdapter.setOnItemChildClickListener { adapter, view, position ->
            when (view?.id) {
                R.id.rl_to_detail -> {
               //此处写接下来的逻辑
                }
            }
        }
  deptListShowAdapter.setOnItemClickListener(OnItemClickListener { adapter, view, position -> 
             //此处写接下来的逻辑
        })

遇到的坑

如果要设置默认折叠或者展开,可以在处理数据的时候设置

listBean.setExpanded(false);

//在实体类Bean继承的BaseExpandNode中有此属性
abstract class BaseExpandNode : BaseNode() {
    var isExpanded: Boolean = true
}


————————————————
版权声明:本文为CSDN博主「跑路羊崽」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29699527/article/details/111516305

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值