详解Android 多级联动控件实现思路讨论
最近有一个需求是选择多级联动数据,数据级别不固定,可能是五级,可能是两级,具体看用户等级。
所以就需要一个多级联动选择控件 ,在网上一番搜索或找到了这个控件, android-pickerview
这个控件在三级以内的的联动都没有问题,但是最多只能到三级。
我在原有的基础上做了一些扩展,主要是添加了两个 picker
multiwheelpickerview 可以根据数据动态生成多个滚轮,不再局限于两个三个选项 dynamicwheelpickerview 也是动态生成,但可以一级一级的加载数据并追加滚轮。
在使用时,根据自身情况让你的 javabean 实现 iwheelitem 或者 idynamicwheelitem 就好。
这里记录并分享一下我的思路和实现,也希望能和大家一起讨论更好的实现方案。
起初,只是想根据获取到的数据动态的生成滚轮,有多少级就生成多少个,自动排列出来就好。
在看了源码后发现原来的 optionspickerview 里写死了三个 wheelview ,所以最多只能是三个。
如果想动态生成 wheelview 就不能写死,只能根据数据生成,所以我选择使用代码创建 wheelview,不使用 layout 布局固定数量了。
除了 wheelview 部分外,其他部分还都是使用原来的布局。
因为要动态显示数据,就不能使用原来的 ipickerviewdata
了,使用了一个新的 iwheelitem
只有两个方法,返回显示数据用来显示在滚轮上;在选择了一级后自动获取下一级内容显示。
这种多级联动的数据,明显有着上下级关系,我就默认为这种结构了,一级套着一级。
并在 wheelview 里做了调整
first of all, 确定数据的层级,根据层级决定生成 wheelview 的数量。
我使用的是一个 linearlayout 横向排列,用来承载动态生成的 wheelview 。
注意:这里有一个问题就是,如果生成的滚轮很多,会显得比较拥挤。
知道了要生成多少个滚轮后,代码创建直接添加到 linearlayout 里了。
生成 wheelview 之后,就是给控件赋值了,我这里默认取第一个当做选中的值。
只要前边一级选中了,那就获取它的下一级数据给下一个控件赋值,如此递归到最后一个。
关于选中的数据和事件,和原来一样,只是换了一种形式,使用 list 容器。
按照顺序,把选中的数据都列在里面了,逻辑如下
就这样稍微改一改,一个动态多级关联控件就有了,在使用时,让你的 javabean 实现 iwheelitem 就好。
简单使用方式如下
虽然实现了多级联动,但是在实际使用时又发现了不可忽视的问题: 如果数据过多,就会加载很长时间,从省级到村级,会有数万条记录,一次获取过来体验太差了,而且有崩溃的风险。
更好的办法是一级一级的去获取数据,选中省级再去获取下属的市级并追加滚轮显示,选中市级再去获取县级,如此类推。
so, 接续改,因为数据也是多次获取了,就无法确定层级了,故需要每有新的层级时添加新的 wheelview 追加到显示容器里(突然增加一个view会出现横跳的情况,最好是加入一个动画平滑一点)。
在选中一个数据时,也要判断是否需要去加载下一级,在我的需求里,有的是需要到村级,有的则需要到县级。
所以具体是否要加载下一级的配置要放出来,我这里放在了数据接口上,由数据自身判断。
在 iwheelitem 的基础上扩展了一个 idynamicwheelitem
然后是在生成 wheelview 这里做了一些修改,根据传入的数据生成。
也是默认选择了第一项,如果能被选中,则继续生成或者去加载子级数据。
在选中一个数据后的滚轮赋值也做了修改,如果是判断是否需要去加载下一级数据或者是否现有数据
在后续没有数据的情况下,也没有移除掉 wheelview 。一旦没有数据就移除,会出现左右横跳的情况(这里也可以做一个动画,会显得没有那么突兀)。
在加载数据成功后,要将数据追加到对应的滚轮上
至此,改完了,比之前那个多放出来两个方法。
在侦听器里扩展了一个加载下级的方法。
使用办法和上面的 multiwheelpickerview 大同小异
具体用法可以看代码,在这里 testmultiwheelactivity
其他想法:
- 目前使用 linearlayout 包裹的,是否可以换成 recyclerview 呢,是否能更好的控制在一行超出多少个后换行,避免拥挤。
- 目前在动态追加滚轮时是很生硬的追加上去的,可以优化为使用动画平滑的过渡可能体验更好些。
目前把代码放在了这里 android-pickerview
我的实现方式就是这样,希望能和大家讨论更好的方式。
到此这篇关于详解android 多级联动控件实现思路讨论的文章就介绍到这了,更多相关android 多级联动内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!