Android中的列表树形展示,AndroidTreeView的使用动态设置树形结构

2023-10-27

1、在项目中用到了这个控件【展示并选择某公司的部门】,但是在使用过程中又出一个问题——我并不知道该公司有几个部门,部门下面是否有子部门?

2、实现步骤如下:【开发工具:Android studio】

① 在项目中添加依赖:compile 'com.github.bmelnychuk:atv:1.2.+'   【是GitHub上的一个框架,搜索AndroidTreeView

② 跟着GitHub上的介绍来做就可以了【如果是已知的部门结构的话,照着GitHub上写就能完成了,问题:不知道多少部门,不知道到部门层级】

③ 具体代码如下:【注意看注释,会有你想要的】

public class JoinDepartmentActivity extends AppCompatActivity implements
        JoinDepartmentCallView, LoadBackShowLayout.OnLoadErrorReload {
    @BindView(R.id.pcenter_toolb)
    Toolbar pcenterToolb;
    @BindView(R.id.contentView)
    RelativeLayout contentView;
    private Unbinder unbinder;
    private RegisterMResult.RegisterListBean bean;
    private JoinDepartmentPresenter presenter;
    private List<DepartmentResult.DepartmentListBean> dataList;
    private TreeNode root;
    private TreeNode parent;
    private TreeNode temp;
    private ArrayList<String> departmentIdList;
    private ArrayList<String> departmentNameList;
    private final int AUDYES = 1;
    private String departmentString = "";
    private int level = 0;
    private int RESULT_CODE = 0x3333;
    private ProgressDialog dialog;
    private LoadBackShowLayout showLayout;
    private LinearLayout.LayoutParams params;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EApplication.addActivities(this);
        setContentView(R.layout.activity_join_department);
        unbinder = ButterKnife.bind(this);
        setToolbar();
        initView();
        initData();
    }

    private void initView() {
        showLayout = new LoadBackShowLayout(this, contentView, this);
    }

    private void setToolbar() {
        setSupportActionBar(pcenterToolb);
    }

    private void initData() {
        departmentIdList = new ArrayList<>();
        departmentNameList = new ArrayList<>();
        dataList = new ArrayList<>();
        /** 这个在下面的节点holder中会使用 */
        params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);


        Intent intent = this.getIntent();
        if (intent == null) return;
        bean = (RegisterMResult.RegisterListBean) intent.getSerializableExtra("data");
        /** 创建树根节点——不会显示,从第一个节点开始显示 */
        root = TreeNode.root();
        /** 第一个节点是parent */
        parent = new TreeNode(new DepartmentResult.DepartmentListBean("0", bean.getCompanyName(), 1)).setViewHolder(new MyHolder(this, 0));
        /** 将第一个节点添加进根节点 */
        root.addChild(parent);
        /** 生成树形布局视图 */
        AndroidTreeView tView = new AndroidTreeView(this, root);
        /** 将树形结构布局视图添加到布局中 */
        contentView.addView(tView.getView());
        if (bean == null) return;
        presenter = new JoinDepartmentPresenter(this);
        dialog = ProgressDialog.show(this, "", "加载中...", true);
        loadData();
    }

    private void loadData() {
        presenter.getDepartmentSonList(this, "", parent, level);
    }

    @OnClick({R.id.toolbar_back, R.id.pc_child_toolbar_subtitle, R.id.pc_child_toolbar_searchbtn})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.toolbar_back:
                finish();
                break;
            case R.id.pc_child_toolbar_subtitle:
                finish();
                break;
            case R.id.pc_child_toolbar_searchbtn:
                showDialog();
                break;
        }
    }

    //加入部门弹出框
    private void showDialog() {
        departmentString = "";
        if (departmentIdList.size() == 0) {
            departmentIdList.add(bean.getCompanyId());
            departmentNameList.add(bean.getCompanyName());
        }
        for (int i = 0; i < departmentNameList.size(); i++) {
            if (i < departmentNameList.size() - 1)
                departmentString += departmentNameList.get(i) + ",";
            else departmentString += departmentNameList.get(i);
        }
        new AlertDialog.Builder(this)
                .setTitle("系统提示")
                .setMessage("确定将【" + bean.getRealname() + "】加入以下部门?\n" + departmentString.trim())
                .setNegativeButton("取消", null)
                .setPositiveButton("确定加入", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        presenter.audRegisterUser(JoinDepartmentActivity.this, bean.getRegId(), AUDYES, null, departmentIdList);
                    }
                }).setCancelable(true).show();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (unbinder != null) unbinder.unbind();
        if (presenter != null) presenter.setCallViewNull(this);
    }

    //-------------------------------------回调开始-------------------------------
    @Override
    public void loadStart() {//开始起查询部门
        if (!dialog.isShowing()) dialog.onStart();
    }

    @Override
    public void getDepartmentListFailure(String msg) {
        if (dialog.isShowing()) dialog.dismiss();
        Toast.makeText(this, "获取部门失败," + msg, Toast.LENGTH_SHORT).show();
    }

    /**
     * @param result 返回结果
     * @param node 父节点
     * @param level 层级
     */
    @Override
    public void getDepartmentListSuccess(DepartmentResult result, TreeNode node, int level) {
        dataList.clear();
        if (result != null && result.getDepartmentList() != null && result.getDepartmentList().size() > 0) {
            dataList.addAll(result.getDepartmentList());
        }
        for (int i = 0; i < dataList.size(); i++) {
            temp = new TreeNode(dataList.get(i)).setViewHolder(new MyHolder(this, (level + 1)));
            /** 将得到的子节点添加到父节点——参数传过来的节点 */
            node.addChild(temp);
            /** 判断有子部门则继续请求 */
            if (dataList.get(i).getSubCount() > 0)
                presenter.getDepartmentSonList(this, dataList.get(i).getDepartmentId(), temp, (level + 1));
        }
        if (dialog.isShowing()) dialog.dismiss();
    }

    @Override
    public void joinSuccess() {
        showLayout.showOnloadOk();
        Toast.makeText(this, "已成功将该人员加入部门", Toast.LENGTH_SHORT).show();
        setResult(RESULT_CODE);
        this.finish();
    }

    @Override
    public void joinFailure(String msg) {
        Toast.makeText(this, "加入部门失败," + msg, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void loadErrorMsg(String msg) {
        showLayout.showOnError(msg);
    }

    @Override
    public void reLoad() {
        level = 0;
        loadData();
    }
    //-------------------------------------回调结束-------------------------------

    /**
     * 自定义节点视图的holder类
     */
    class MyHolder extends TreeNode.BaseNodeViewHolder<DepartmentResult.DepartmentListBean> {
        private int level;//表示层级
        private boolean isExpand = false;
        private DepartmentResult.DepartmentListBean bean;

        public MyHolder(Context context, int level) {
            super(context);
            this.level = level;
        }

        @Override
        public View createNodeView(final TreeNode node, final DepartmentResult.DepartmentListBean value) {
            this.bean = value;
            final LayoutInflater inflater = LayoutInflater.from(context);
            final View view = inflater.inflate(R.layout.item_only_text, null, false);
            /** 设置节点的布局,使其宽度——martch_parent,高度——wrap_content */
            view.setLayoutParams(params);
            /** 根据层级来设置左边的缩进 */
            view.setPadding(level * 50, view.getPaddingTop(), view.getRight(), view.getPaddingBottom());
            TextView tvValue = (TextView) view.findViewById(R.id.only_text);
            final CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkbox);
            final CheckBox checkBoxRight = (CheckBox) view.findViewById(R.id.checkbox_right);
            if (value.getSubCount() > 0) {
                checkBoxRight.setVisibility(View.VISIBLE);
            } else {
                checkBoxRight.setVisibility(View.GONE);
            }
            checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (isChecked) {
                        //选中则添加
                        departmentIdList.add(value.getDepartmentId());
                        departmentNameList.add(value.getName());
                    } else {
                        //取消选中则移除
                        departmentIdList.remove(value.getDepartmentId());
                        departmentNameList.remove(value.getName());
                    }
                }
            });
            node.setClickListener(new TreeNode.TreeNodeClickListener() {
                @Override
                public void onClick(TreeNode node, Object value) {
                    if (isExpand) {
                        checkBoxRight.setBackgroundResource(R.drawable.arrow_right_gray);
                        isExpand = false;
                        /** 没有子部门点击整列(即:点击节点)选中该部门 */
                        if (bean.getSubCount() == 0) {
                            checkBox.setChecked(false);
                        }
                    } else {
                        checkBoxRight.setBackgroundResource(R.drawable.arrow_down_gray);
                        isExpand = true;
                        if (bean.getSubCount() == 0) {
                            checkBox.setChecked(true);
                        }
                    }

                }
            });
            tvValue.setText(value.getName());
            return view;
        }
    }
}

④ 代码执行过程:进入该Activity添加根节点,根节点添加parent节点【公司】,得到parent下面的子部门,判断子部门下还有子部门则继续请求,没有则不请求。

开始请求就弹出“加载中..”的progressdialog【cancelable=false】,返回则取消,直到最后一次返回才dialog消失。这个时候可以点节点点出子级部门

⑤ 下面节点布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:paddingTop="10dp"
    android:paddingBottom="10dp"
    android:orientation="horizontal"
    android:background="@drawable/line_top"
    >
    <CheckBox
        android:id="@+id/checkbox"
        android:layout_width="20dp"
        android:layout_height="20dp"
        android:layout_marginLeft="3dp"
        android:layout_gravity="center"
        android:button="@null"
        android:background="@drawable/radiobtn_bg"
        />
    <TextView
        android:id="@+id/only_text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_weight="1"
        android:gravity="left|center_vertical"
        android:layout_gravity="center_vertical"
        android:maxLines="1"
        android:ellipsize="end"
        />
    <CheckBox
        android:id="@+id/checkbox_right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:button="@null"
        android:background="@drawable/arrow_right_gray"
        />
</LinearLayout>
 ⑥ 下面是Activity布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_join_department"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    >

    <android.support.v7.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white"
        android:id="@+id/pcenter_toolb"
        android:contentInsetStart="0dp"
        >
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_gravity="center_vertical"
            android:paddingRight="@dimen/pc_child_toolbar_paddingright"
            >
            <ImageButton
                android:id="@+id/toolbar_back"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:background="@color/white"
                android:src="@drawable/pc_child_toolbar_back"
                />
            <TextView
                android:id="@+id/pc_child_toolbar_subtitle"
                style="@style/pc_toolbar_subtitle"
                android:layout_toRightOf="@+id/toolbar_back"
                android:text="@string/registerm_unaud"
                />
            <TextView
                android:id="@+id/pc_child_toolbar_title"
                style="@style/pc_toolbar_title"
                android:text="@string/registerm_choosedepartment"
                />
            <TextView
                android:id="@+id/pc_child_toolbar_searchbtn"
                android:layout_width="wrap_content"
                android:layout_height="@dimen/pc_child_toolbar_searchbar_w_h"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:gravity="center"
                android:text="加入部门"
                android:textColor="@color/deepred"
                />
        </RelativeLayout>
    </android.support.v7.widget.Toolbar>
    <!-- 节点将会添加到此布局中 -->
    <RelativeLayout
        android:id="@+id/contentView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/line_top"
        />
</LinearLayout>





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android中的列表树形展示,AndroidTreeView的使用动态设置树形结构 的相关文章

随机推荐

  • scscanner:一款功能强大的大规模状态码扫描工具

    关于scscanner scscanner是一款功能强大的大规模状态码扫描工具 该工具可以帮助广大研究人员从一个URL列表文件中批量读取目标网站的状态码响应信息 除此之外 该工具还可以过滤出指定的状态码 并将结果存储到一个文件中以供后续深入
  • neon常用指令(updating)

    函数参考手册 https developer arm com architectures instruction sets simd isas neon intrinsics 并在左侧选择neon Neon 128bit寄存器 所以可支持并
  • mysql将一张表插入到另一张表

    1 表1和表2的字段完全相同且要把表2所有的数据都插入到表1 可以用这种方法 insert into table1 select from table2 2 但是更多的时候我们只希望导入指定字段 可以用这种方法 insert into ta
  • 冯思远:Apache TVM 与机器学习编译发展

    下午好 欢迎大家今天来参加 2023 Meet TVM 作为 Apache TVM PMC 由我来给大家做关于 TVM 的发展以及 TVM 未来 Unity 框架的分享 Apache TVM Evolution 首先为什么会有 MLC Ma
  • 双指针算法模板及例题

    双指针算法时间复杂度O n 一般双指针算法运用于有序的某一个或两个序列中 从O n2 优化到O n 算法模板 for int i 0 j 0 i lt n i while j lt i check i j j 具体问题的逻辑 常见问题分类
  • stm32 mpu6050 cubemx 卡尔曼滤波法读取角度

    文章目录 前言 一 cubemx配置 二 mpu6050文件移植 mpu6050 c mpu6050 h 三 主函数 前言 本文简述使用mpu6050读取原始数据后解算出角度 网上大多都是dmp库来解算 但是这种情况操作起来相对复杂 更方便
  • electron入门案例

    目录解构 main js 主进程文件 用来控制整个应用程序 仅有一个 index html 渲染模板 render index js 渲染进程文件 用来控制页面的渲染 可有多个 package json 依赖包 主进程代码 在electro
  • 四. ZooKeeper 作为 SpringCloud 注册中心配置

    目录 一 简单概述 二 配置服务注册到 ZooKeeper 1 服务提供方 yml 文件配置注册到 ZooKeeper 2 服务消费方 yml 文件配置注册到 ZooKeeper 3 服务消费方配置 RestTemplate 注入到容器中
  • 【JAVA】我们常常谈到的方法是指什么?

    个人主页 个人主页 系列专栏 初识JAVA 文章目录 前言 方法 方法的分类 方法的定义 方法调用 方法重载 前言 在之前的文章中我们总是会介绍到类中的各式各样的方法 也许在应用中我们对它已经有了初步的了解 今天我们就来详细的介绍一下 方法
  • 经典卷积神经网络(CNN)图像分类算法详解

    本文原创 转载请引用 https blog csdn net dan teng article details 87192430 CNN图像分类网络 一点废话 CNN网络主要特点是使用卷积层 这其实是模拟了人的视觉神经 单个神经元只能对某种
  • QT获取一些机器相关信息的方法

    获取机器码的方法 按照注释传入相应的参数 即可获得对应的码 获取cpu名称 wmic cpu get Name 获取cpu核心数 wmic cpu get NumberOfCores 获取cpu线程数 wmic cpu get Number
  • 手把手教你对接快手小店开发者商家应用

    不懂就问 什么是快手小店 A 快手小店是快手电商于2018年6月推出的 后续以京东作为供应链 在短视频 直播中打开电商的新纪元 与其可以同态竞技的有抖音小店 以及淘宝直播 那么 要对接快手小店的接口 就需要申请快手开发者 在开发者账户内新建
  • 【Vue入门】语法 —— 插值、指令、过滤器、计算属性、监听器

    目录 一 模版语法 1 1 插值 1 1 1 文本 1 1 2 html解析 1 1 3 属性 1 1 4 表达式 1 2 指令 1 2 1 核心指令 1 2 3 动态参数 二 过滤器 2 1 局部过滤器 2 2 全局过滤器 三 计算属性
  • CRC 校验计算

    一 简介 CRC即循环冗余校验码 Cyclic Redundancy Check 是数据通信领域中最常用的一种查错校验码 其特征是信息字段和校验字段的长度可以任意选定 其根本思想就是先在要发送的帧后面附加校验码 再发送给接收端 校验码要使所
  • python opengl 入门

    安装 pip install pyglet 入门demo import pyglet window pyglet window Window label pyglet text Label Hello world font name Tim
  • 图像语义分割概述

    图像语义分割概述 一 图像语义分割概念 图像语义分割 Image Semantic Segmentation 是一项计算机视觉任务 其目标是将输入的图像分割成多个区域 并为每个像素分配一个语义类别标签 以表示该像素属于图像中的哪个物体或区域
  • WheelCollider笔记

    The Wheel Collider is a special collider for grounded vehicles It has built in collision detection wheel physics and a s
  • Sapir—Whorf Hypothesis (萨皮尔—沃尔夫假说)

    Sapir Whorf Hypothesis 萨皮尔 沃尔夫假说 Sapir Whorf Hypothesis 的思想源头可追溯到德国哲学家海德 G Herder 1744 1803 Wilhelm von Humboldt 1762 18
  • win11本地安全机构保护已关闭怎么办?如何修复windows11本地安全机构保护已关闭?

    win11本地安全机构保护已关闭怎么办 如何修复windows11本地安全机构保护已关闭 近日有windows11系统用户反映说遇到了这样一个问题 启动电脑后 发现windows右下角的安全中心图标上会显示一个黄色叹号 打开windows安
  • Android中的列表树形展示,AndroidTreeView的使用动态设置树形结构

    1 在项目中用到了这个控件 展示并选择某公司的部门 但是在使用过程中又出一个问题 我并不知道该公司有几个部门 部门下面是否有子部门 2 实现步骤如下 开发工具 Android studio 在项目中添加依赖 compile com gith