Android-RecyclerView实现多页面答题流程,翻页/提交实现+RV加背景无法下一步问题

最近要实现这样滴效果:

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库里面去!

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • 一、简历准备 1、个人技能 (1)自定义控件、UI设计、常用动画特效 自定义控件 ①为什么要自定义控件? Andr...
    lucas777阅读 5,186评论 2 54
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,345评论 0 17
  • 1、窗体 1、常用属性 (1)Name属性:用来获取或设置窗体的名称,在应用程序中可通过Name属性来引用窗体。 ...
    Moment__格调阅读 4,475评论 0 11
  • 起因 RV在几乎在所有的有界面的Android应用都会使用到,可以说日常开发中RV是老熟人天天见,可是仔细想想熟悉...
    msisuzney阅读 1,294评论 0 3
  • 简书为伴娱春夏,自小慕诗家。 寄言笔墨。无心插柳,有意栽花。 也曾痴梦,共呤词赋,描画眉鸦。 关山万阻,明珠退赠,...
    陈凤_chen阅读 269评论 0 1