Android 仿钉钉组织架构功能,动态创建多个按钮,并给每个按键添加监听事件

本文主要是介绍Android 仿钉钉组织架构功能,动态创建多个按钮,并给每个按键添加监听事件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

现在基本上很多的企业都会使用钉钉,然后细心地人会看到钉钉组织架构功能。在联系人中放着一个可以展开的公司,下面有组织架构和自己所在的部门。


现在我们产品经理说我们项目中也要加入组织架构功能,而且给个变态的需求就是如果一个人在多家公司呢。那就得有多个组织架构了。

这个需求你可能一下就会想到用ExpandListView能解决所有问题。可以呢,如果他本身就存在在ExpandListView的header或者ListView的header中,你直接放入ExpandListView确定不影响滑动的时候的性能吗,在某些机型上滑动的时候会流畅吗。答案是:不允许这样嵌套

于是我就想到一个办法,就是动态的去生成item,并给每一个item加上点击监听,还有变态需求就是如果存在一个人多家公司,那么就要双层item并进行点击监听。

下面是我做的效果,就是通过动态添加和动态监听。


代码分析:

//点击展开组织架构事件RelativeLayout rl__organization_head[] = new RelativeLayout[organizationList.size()];//箭头m_final ImageView iv_organization_arrow[] = new ImageView[organizationList.size()];//组织架构的bodyfinal LinearLayout ll_organization_body[] = new LinearLayout[organizationList.size()];for (int j = 0; j < organizationList.size(); j++) {//初始化header(公司)部分organization_header_view = LayoutInflater.from(mContext).inflate(R.layout.item_organization_header, null);tv_organization_header_text = (TextView) organization_header_view.findViewById(R.id.tv_organizational_organization);rl__organization_head[j] = (RelativeLayout) organization_header_view.findViewById(R.id.rl__organization_head);iv_organization_arrow[j] = (ImageView) organization_header_view.findViewById(R.id.iv_organization_arrow);ll_organization_body[j] = (LinearLayout) organization_header_view.findViewById(R.id.ll_organization_body);tv_organization_header_text.setText(organizationList.get(j).getOrganizationName());//组织架构body(部门)-nameTextView tv_organization_body_text[][] = new TextView[organizationList.size()][organizationList.get(j).getOrganizations().size()];for (int i = 0; i < organizationList.get(j).getOrganizations().size(); i++) {//初始化body(部门)部分insitution_body_view = LayoutInflater.from(mContext).inflate(R.layout.item_organization_body, null);tv_organization_body_text[j][i] = (TextView) insitution_body_view.findViewById(R.id.tv_organization_body_text);view_organization_body_text_line = insitution_body_view.findViewById(R.id.view_organization_body_text_line);if (i == 0) {view_organization_body_text_line.setVisibility(View.GONE);}tv_organization_body_text[j][i].setText(organizationList.get(j).getOrganizations().get(i).getOrganizationName());ll_organization_body[j].addView(insitution_body_view);final int finalJ1 = j;final int finalI = i;tv_organization_body_text[j][i].setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String departmentName = organizationList.get(finalJ1).getOrganizations().get(finalI).getOrganizationName();String departmentId = organizationList.get(finalJ1).getOrganizations().get(finalI).getOrganizationId();Intent intent = new Intent(getActivity(), OrganizationActivity.class);intent.putExtra("organizationId", organizationList.get(finalJ1).getOrganizationId());intent.putExtra("organizationName", organizationList.get(finalJ1).getOrganizationName());if (finalI > 0) {intent.putExtra("nextFlag", "next");intent.putExtra("firstIntent", "first");}intent.putExtra("departmentId", departmentId);intent.putExtra("departmentName", departmentName);startActivity(intent);}});}//默认关闭组织架构ll_organization_body[j].setVisibility(View.GONE);iv_organization_arrow[j].setBackgroundResource(R.drawable.cell_header_down);ll_organization_header.addView(organization_header_view);final int finalJ = j;rl__organization_head[j].setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (isShowFra) {iv_organization_arrow[finalJ].setBackgroundResource(R.drawable.cell_header_up);isShowFra = false;ll_organization_body[finalJ].setVisibility(View.VISIBLE);} else {iv_organization_arrow[finalJ].setBackgroundResource(R.drawable.cell_header_down);isShowFra = true;ll_organization_body[finalJ].setVisibility(View.GONE);}}});}}
有道行的一眼就能看出怎么回事,对我用的数组去处理点击监听问题。类似仿写一个简单的ExpandListView,对绘制和滑动没有任何影响,占用内存也不大。

就是不断的addView动态将item addView到第二层,然后再将第二层动态addView到第一层,以双重for循环处理。organizationList.size()就可以生成多少个公司的组织架构。是不是类似与ExpandListView了,这里为什么不用ExpandListView,是因为这个组件要放在ExpandListView的header里面,至少这样也不会影响ExpandListView的性能。

至于如果只要一个公司呢,organizationList.size() = 1或者拆分出只要一层for循环就行了。精华部分就是怎么去给每一个item添加点击监听事件,这个解决了,多少层都没有问题,一个大树都没有问题。


补充组织架构里面部门的写法,也是简单一级循环监听的方式来处理部门列表的显示,当然也可以用listview也可以做,只是需要对数据处理

/*** 处理部门显示的ui*/private void handleDepartmentUi() {if (departmentData != null && departmentData.size() > 0) {for (int i = 0; i < departmentData.size(); i++) {department_item_view = LayoutInflater.from(this).inflate(R.layout.item_organization_department, null);rl_department_item = (RelativeLayout) department_item_view.findViewById(R.id.rl_organization_department_item);tv_department_name = (TextView) department_item_view.findViewById(R.id.tv_organization_department_name);tv_department_count = (TextView) department_item_view.findViewById(R.id.tv_organization_department_count);tv_department_name.setText(departmentData.get(i).getOrganizationName());
//                tv_department_count.setText("100");//统一监听每个itemrl_department_item.setOnClickListener(clickListener);rl_department_item.setTag(i);ll_department_item.addView(department_item_view);}} else {ll_department_item.setVisibility(View.GONE);view_department_line_1.setVisibility(View.GONE);}}/*** 处理组织架构item的监听*/private View.OnClickListener clickListener = new View.OnClickListener() {@Overridepublic void onClick(View v) {int id = (Integer) v.getTag();Intent intent = new Intent(DepartmentActivity.this, OrganizationActivity.class);intent.putExtra("departmentName", departmentData.get(id).getOrganizationName());intent.putExtra("departmentId", departmentData.get(id).getOrganizationId());intent.putExtra("organizationId", organizationId);intent.putExtra("organizationName", organizationName);intent.putExtra("nextFlag", "next");startActivityForResult(intent, CLOSEREQUESTCODE);}};

这里就是我简单处理部门的方式,其实listview也可以做的,但是要看需求

不知道是否是你们所需要的,还是其他部分,可以提问




这篇关于Android 仿钉钉组织架构功能,动态创建多个按钮,并给每个按键添加监听事件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/775682

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

SpringBoot整合DeepSeek实现AI对话功能

《SpringBoot整合DeepSeek实现AI对话功能》本文介绍了如何在SpringBoot项目中整合DeepSeekAPI和本地私有化部署DeepSeekR1模型,通过SpringAI框架简化了... 目录Spring AI版本依赖整合DeepSeek API key整合本地化部署的DeepSeek

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

css实现图片旋转功能

《css实现图片旋转功能》:本文主要介绍了四种CSS变换效果:图片旋转90度、水平翻转、垂直翻转,并附带了相应的代码示例,详细内容请阅读本文,希望能对你有所帮助... 一 css实现图片旋转90度.icon{ -moz-transform:rotate(-90deg); -webkit-transfo