最近要实现这样滴效果:
也就没有去找什么三方了,直接干上原始的控件RecyclerView来实现多个答题页面。
实现思路:
1. 添加RV控件,可以指定宽高全屏,周边通过margin或者外层控件设置padding实现间距;
2. 设置水平显示 - LinearLayoutManager.HORIZONTAL
2.1 同时设置不能手动滑动。不然干嘛要用上一步下一步按钮呢? - 利用canScrollHorizontally实现禁止手动滑动
3. 第一个答题页只显示下一步,最后一个页面只显示上一步和提交,其他情况显示上一步,下一步 - 判断当前页是第几页实现隐藏显示逻辑
4. 点击上一步下一步需要实现代码切换页面 - 利用RV的scrollToPosition进行切换
5. 提交时需要获取所有页面选择信息? - 这个由于需要获取所有页面的提交信息,而我们通过RV相关方法获取不到隐藏页面的信息,这个涉及相关问题,网上很多,具体可以深入研究。小萌新的做法是当点击下一步的时候就会回调上一页的数据,同时点击下一步之前必须填写上一步,这样就同时判断和获取了上一页页面信息。 当返回上一页继续重新选择时,点击下一步同样获取当前选择信息,然后重新set一下(相当于就更新了选择信息)
6. RV多页面采用多布局实现,根据答题类型分为:输入框,地区选择,时间选择,单选,多选这几类,传入数据只需要分好需要的类别即可实现不同答题类型的组合。不同类型页面顺序自行调整即可。 小萌新后台都给死了,尴尬,,,,不过无所谓,我们的适配器反正是活的,大不了处理数据写死就完事了!
7. 多选采用了第三方的TagFlowLayout实现。获取哪些选择了采用它的getSelectedList方法(这个是一个索引数组,正好利用索引获取选择的答案的相关信息)
8. 单选采用RV实现,条目采用CheckBox控件,选中状态互斥变化采用setOnCheckedChangeListener方法来做逻辑(保存上一个选中的lastCheckBox,然后下一个选中后,清空上一个选择的CheckBox) - 目前这个回调运行两次,因为涉及到两个控件的变化。 所以目前来看,实现方式不好 - 建议换个方式实现更好!不然逻辑不好调试.....
以上是一个思路总结,也是最终实现的过程总结。 总得下来目前来看没什么大问题。。具体细节就不贴了,有觉得有参考价值的,可以私聊。。
关于获取数据做个提示,这里我采用的是获取ViewHolder的方式,然后根据ViewHolder的类型来区分获取的是哪种数据,而获取当前可见页面的ViewHolder的方法如下:
mathchRv.getChildViewHolder(mathchRv.getChildAt(0)))
看下getData方法吧,大概你就能猜出了:
public boolean getData(RecyclerView.ViewHolder viewHolder){
if (viewHolder instanceof SmartMatchAdapter.ViewHolderOne){
if (((SmartMatchAdapter.ViewHolderOne) viewHolder).getData().equals("")){
return false;
}
smartMatchSelectedBean.setName(((SmartMatchAdapter.ViewHolderOne) viewHolder).getData());
} else if (viewHolder instanceof SmartMatchAdapter.ViewHolderTwo){
if (null == ((SmartMatchAdapter.ViewHolderTwo) viewHolder).getData() ||
((SmartMatchAdapter.ViewHolderTwo) viewHolder).getData().length < 1){
return false;
}
smartMatchSelectedBean.setRegister_city_id(((SmartMatchAdapter.ViewHolderTwo) viewHolder).getData()[0]);
smartMatchSelectedBean.setRegister_region_id(((SmartMatchAdapter.ViewHolderTwo) viewHolder).getData()[1]);
} else if (viewHolder instanceof SmartMatchAdapter.ViewHolderThree){
Map<String, String[]> map = ((SmartMatchAdapter.ViewHolderThree) viewHolder).getData();
if (null == map){
return false;
}
for(String key : map.keySet()){
String[] value = map.get(key);
if (key.contains("您的公司所属的领域是")){
smartMatchSelectedBean.setIndustry(value);
} else if (key.contains("申请人背景")){
smartMatchSelectedBean.setApply_backdrop(value);
}
}
} else if (viewHolder instanceof SmartMatchAdapter.ViewHolderFour){
if (null == ((SmartMatchAdapter.ViewHolderFour) viewHolder).getData()){
return false;
}
Map<String, Integer> map = ((SmartMatchAdapter.ViewHolderFour) viewHolder).getData();
if (null == map){
return false;
}
for(String key : map.keySet()){
int value = map.get(key);
if (key.contains("您的公司拥有的知识产权数量")){
smartMatchSelectedBean.setProp_num(value);
} else if (key.contains("您的公司拥有的发明专利数量")){
smartMatchSelectedBean.setInvent_num(value);
} else if (key.contains("您的公司是否是国家高新技术产业")){
smartMatchSelectedBean.setHigh_tech(value);
} else if (key.contains("您的企业上年度的营收是")){
smartMatchSelectedBean.setPrev_earn(value);
} else if (key.contains("您的企业上年度的研发费用是")){
smartMatchSelectedBean.setPrev_earn(value);
} else if (key.contains("您的企业总共获得的融资金额是")){
smartMatchSelectedBean.setFinance(value);
}
}
} else if (viewHolder instanceof SmartMatchAdapter.ViewHolderFive){
if (null == ((SmartMatchAdapter.ViewHolderFive) viewHolder).getData() ||
((SmartMatchAdapter.ViewHolderFive) viewHolder).getData().equals("")){
return false;
}
smartMatchSelectedBean.setRegister_at(((SmartMatchAdapter.ViewHolderFive) viewHolder).getData());
}
return true;
}
每个holder里面提供对应获取数据的方法就可以,这样外面点击下一步的时候就可以调用获取到当前的数据,同时还能判断是否填写了,实现跳转逻辑:
如下是viewholder提供的获取数据的方法:
如下是上一步下一步的逻辑判断(隐藏判断,数据判断、跳转等逻辑):
简单记录下,可供思路参考。。。我相信肯定有更好的封装.....
未能判断单选选中状态问题啦: 另外最后完成了,然后完善样式,就是增加一个蓝色背景图,同时RV边框做圆角,padding这些的时候,我本来想直接在RV上做,发现那样影响我获取RV单选选中状态(就是拿不到单选状态结果)。点击下一步怎么都没有反应。。。 估计是RV嵌套RV,同时RV设置了padding,背景等的影响,具体没细研究哈!
解决:RV不用做改动,外层包一层控件做就行了,那样就没问题了
<android.support.constraint.ConstraintLayout
android:id="@+id/asm_mathchRvRoot"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginBottom="6dp"
android:background="@drawable/corner_white_bg_shape"
android:padding="8dp"
app:layout_constraintBottom_toTopOf="@+id/asm_mathchChooseRoot"
app:layout_constraintTop_toTopOf="parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/asm_mathchRv"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
有空可以做更完善的封装,集成到commonui库里面去!
做个记录,给自己增加点努力的动力。。。。