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

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>





  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Android树形列表选择是一种在Android应用程序常见的交互方式。它通常用于展示多级节点结构的数据,并提供用户选择其一个节点作为最终的选择结果。 树形列表选择的实现方式可以有多种,其一种常见的方式是使用ExpandableListView控件。ExpandableListView是Android Framework提供的一个可展开的列表控件,它可以展示多级的列表项,每个列表项可以包含子项。通过合理的数据结构和适配器的使用,我们可以在ExpandableListView展示树形结构的数据。 当用户使用树形列表选择时,他们可以通过展开和折叠各级列表项来查看和浏览多级节点。用户可以选择想要的最终节点,并通过点击或其他交互方式进行选择。选择的结果可以是单个节点,也可以是多个节点,具体取决于业务需求。 在选择过程,我们通常会为用户提供一些交互和反馈方式来增强用户体验。例如,我们可以使用勾选框或图标来表示节点的选择状态。当用户选择某个节点时,我们可以即时地更新选择状态,并提供视觉反馈,以便用户清晰地知道他们的选择。 总的来说,Android树形列表选择是一种方便、直观的交互方式,可以帮助用户在包含多级节点的数据结构进行选择。通过合理的展示和交互设计,我们可以提供一个良好的用户体验,帮助用户准确、高效地进行选择操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值