Android-RecyclerView实现多页面答题流程,翻页

作者: MonkeyLei | 来源:发表于2019-08-01 17:25 被阅读27次

最近要实现这样滴效果:

image image image image

也就没有去找什么三方了,直接干上原始的控件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提供的获取数据的方法:

image

如下是上一步下一步的逻辑判断(隐藏判断,数据判断、跳转等逻辑):

image

简单记录下,可供思路参考。。。我相信肯定有更好的封装.....

未能判断单选选中状态问题啦: 另外最后完成了,然后完善样式,就是增加一个蓝色背景图,同时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库里面去!

做个记录,给自己增加点努力的动力。。。。

相关文章

网友评论

    本文标题:Android-RecyclerView实现多页面答题流程,翻页

    本文链接:https://www.haomeiwen.com/subject/cvycdctx.html