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

相关文章

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.