新接手项目里面有个做题功能,之前项目的做题是用RN做的渲染,现在看他是用原生实现的。 既然用原生,要实现左右滑动和题目跳转这些功能,除了ViewPager应该是没有一个能打的。
PS:主要功能
1.单选题、多选题、材料题等等(填空、问答、判断)
2.单选题点击答案自动跳转下一题,顶部题数跟着改变
3.左右滑动进行换题,最后一题进行提示
4.题卡的跳转和交卷弹窗
5.数据的存储
思路
首先确定页面如何进行分离,底部的功能Icon是不变的,所以可以放在Activity中;上面的题型和做题序号可变,但是可变性不大,可以放在公共VIew;中间的做题本身的内容是可变的(题型可变),可以根据加载不同的XML进行渲染。
实现方式
ViewPager + PagerAdapter(根据不同Type实现多种View)
主要是在PagerAdapte的重写方法instantiateItem中。
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
HomeworkQuestionBean questionBean = mList.get(position);
View view = switchQuestionWidget(questionBean, position + 1, mList.size());
ScrollView scrollView = new ScrollView(mContext);
scrollView.setFillViewport(true);
scrollView.setVerticalScrollBarEnabled(false);
scrollView.addView(view, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
container.addView(scrollView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
return scrollView;
}
这里面有个封装,就是对不同题型页面进行单独自定义,重点是在BasehomeWorkQuestionWidget
private View switchQuestionWidget(HomeworkQuestionBean question, int index, int totalNum) {
BaseHomeworkQuestionWidget mWidget;
HomeworkQuestionBean.HomeworkQuestionTypeBean typeBean = question.getType();
int layoutId = 0;
switch (typeBean) {
case choice://多选
case uncertain_choice://不定向
layoutId = R.layout.item_pager_homework_question_choice;
break;
case single_choice://单选题
layoutId = R.layout.item_pager_homework_question_singlechoice;
break;
case essay://问答题
layoutId = R.layout.item_pager_homework_question_essay;
break;
case determine://判断题
layoutId = R.layout.item_pager_homework_question_determine;
break;
default:
break;
}
mWidget = (BaseHomeworkQuestionWidget) LayoutInflater.from(mContext).inflate(layoutId, null);
mWidget.setData(question, index, totalNum);
return mWidget;
}
Demo地址:
https://github.com/spuermax/SuperTest(里面包含很多平常自己用的demo例子)
搜索QuestionActivity页面
case R.id.tv_question:
intent2Activity(QuestionActivity.class);
break;