android 实现调查问卷-单选-多选
转载请加地址:http://blog.****.net/jing110fei/article/details/46618229
先上效果图
个人分析,最好是用动态布局加载来实现,好了,说思路,将这整体分为3块
最外面这个布局里面,根据第二层问题的数量来动态生成布局,加入在第一层布局里面,
然后再根据问题下答案的数量来动态生成布局,加入第二层布局里面,思路这么透彻,想想还有些小激动呢。
先建造三个实体类
- public class Page {
- //问卷id
- private String pageId;
- //问卷状态
- private String status;
- //问卷主题
- private String title;
- //题目
- private ArrayList<Quesition> quesitions;
- public ArrayList<Quesition> getQuesitions() {
- return quesitions;
- }
- public void setQuesitions(ArrayList<Quesition> quesitions) {
- this.quesitions = quesitions;
- }
- public String getPageId() {
- return pageId;
- }
- public void setPageId(String pageId) {
- this.pageId = pageId;
- }
- public String getStatus() {
- return status;
- }
- public void setStatus(String status) {
- this.status = status;
- }
- public String getTitle() {
- return title;
- }
- public void setTitle(String title) {
- this.title = title;
- }
- }
- public class Quesition {
- //题目id
- private String quesitionId;
- //单选多选标识
- private String type;
- //题目
- private String content;
- //选项
- private ArrayList<Answer> answers;
- //是否解答
- private int que_state;
- public int getQue_state() {
- return que_state;
- }
- public void setQue_state(int que_state) {
- this.que_state = que_state;
- }
- public String getQuesitionId() {
- return quesitionId;
- }
- public void setQuesitionId(String quesitionId) {
- this.quesitionId = quesitionId;
- }
- public String getType() {
- return type;
- }
- public void setType(String type) {
- this.type = type;
- }
- public String getContent() {
- return content;
- }
- public void setContent(String content) {
- this.content = content;
- }
- public ArrayList<Answer> getAnswers() {
- return answers;
- }
- public void setAnswers(ArrayList<Answer> answers) {
- this.answers = answers;
- }
- }
- public class Answer {
- //答案id
- private String answerId;
- //答案主体
- private String answer_content;
- //答案是否被解答
- private int ans_state;
- public int getAns_state() {
- return ans_state;
- }
- public void setAns_state(int ans_state) {
- this.ans_state = ans_state;
- }
- public String getAnswerId() {
- return answerId;
- }
- public void setAnswerId(String answerId) {
- this.answerId = answerId;
- }
- public String getAnswer_content() {
- return answer_content;
- }
- public void setAnswer_content(String answer_content) {
- this.answer_content = answer_content;
- }
- }
下面来看看布局,总工用到了3个布局。
首先是activity_main.xml
- <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="#e6e4e3" >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="#EA5514"
- android:orientation="horizontal" >
- <ImageView
- android:id="@+id/test_back"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="left|center_vertical"
- android:layout_marginLeft="5dp"
- android:padding="5dp"
- android:background="@drawable/ic_back_white"
- />
- <TextView
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:text="调查问卷"
- android:textSize="18sp"
- android:textColor="@android:color/white"
- android:layout_gravity="center"
- android:gravity="center"/>
- </LinearLayout>
- <TextView
- android:id="@+id/txt_title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="10sp"
- android:layout_marginTop="40dp"
- android:layout_marginLeft="30dp"
- android:textColor="#898989"
- />
- <LinearLayout
- android:id="@+id/lly_test"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
- </LinearLayout>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- >
- <Button
- android:id="@+id/submit"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginTop="50dp"
- android:layout_marginBottom="30dp"
- android:text="提交"
- android:textSize="20sp"
- android:textColor="@android:color/white"
- android:layout_gravity="center"
- android:gravity="center"
- android:background="@drawable/button_submit"/>
- </LinearLayout>
- </LinearLayout>
- </ScrollView>
然后是quesition_layout.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:paddingTop="35dp"
- >
- <TextView
- android:id="@+id/txt_question_item"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="14sp"
- android:textColor="#3e3a39"
- android:layout_marginLeft="45dp"
- />
- <LinearLayout
- android:id="@+id/lly_answer"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:layout_marginLeft="30dp"
- android:layout_marginRight="30dp"
- android:layout_marginTop="10dp"
- android:background="@drawable/shape_dialog_radius_all"
- >
- </LinearLayout>
- </LinearLayout>
//然后是answer_layout.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="30dp"
- android:orientation="vertical"
- >
- <LinearLayout
- android:id="@+id/lly_answer_size"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="horizontal"
- >
- <ImageView
- android:id="@+id/image"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_margin="10dp"/>
- <TextView
- android:id="@+id/txt_answer_item"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="12sp"
- android:textColor="#595757"
- android:layout_gravity="center_vertical"
- />
- </LinearLayout>
- <View
- android:id="@+id/vw_line"
- android:layout_width="match_parent"
- android:layout_height="1dp"
- android:background="#9EA0A0"
- >
- </View>
- </LinearLayout>
然后是主要代码,长久不写博客,有点生疏了,大家顺着思路来看,注释也差不多详尽,如果有不明白的再讨论
- public class MainActivity extends Activity {
- private LinearLayout test_layout;
- private Page the_page;
- //答案列表
- private ArrayList<Answer> the_answer_list;
- //问题列表
- private ArrayList<Quesition> the_quesition_list;
- //问题所在的View
- private View que_view;
- //答案所在的View
- private View ans_view;
- private LayoutInflater xInflater;
- private Page page;
- //下面这两个list是为了实现点击的时候改变图片,因为单选多选时情况不一样,为了方便控制
- //存每个问题下的imageview
- private ArrayList<ArrayList<ImageView>> imglist=new ArrayList<ArrayList<ImageView>>();
- //存每个答案的imageview
- private ArrayList<ImageView> imglist2;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- xInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- //假数据
- initDate();
- //提交按钮
- Button button=(Button)findViewById(R.id.submit);
- button.setOnClickListener(new submitOnClickListener(page));
- }
- private void initDate() {
- //假数据
- // TODO Auto-generated method stub
- Answer a_one=new Answer();
- a_one.setAnswerId("0");
- a_one.setAnswer_content("男");
- a_one.setAns_state(0);
- Answer a_two=new Answer();
- a_two.setAnswerId("1");
- a_two.setAnswer_content("女");
- a_two.setAns_state(0);
- Answer a_three=new Answer();
- a_three.setAnswerId("3");
- a_three.setAnswer_content("是");
- a_three.setAns_state(0);
- Answer a_four=new Answer();
- a_four.setAnswerId("4");
- a_four.setAnswer_content("不是");
- a_four.setAns_state(0);
- Answer a_three1=new Answer();
- a_three1.setAnswerId("3");
- a_three1.setAnswer_content("是");
- a_three1.setAns_state(0);
- Answer a_four1=new Answer();
- a_four1.setAnswerId("4");
- a_four1.setAnswer_content("不是");
- a_four1.setAns_state(0);
- ArrayList<Answer> answers_one=new ArrayList<Answer>();
- answers_one.add(a_one);
- answers_one.add(a_two);
- ArrayList<Answer> answers_two=new ArrayList<Answer>();
- answers_two.add(a_one);
- answers_two.add(a_two);
- answers_two.add(a_three);
- answers_two.add(a_four);
- ArrayList<Answer> answers_three=new ArrayList<Answer>();
- answers_three.add(a_one);
- answers_three.add(a_two);
- answers_three.add(a_three);
- answers_three.add(a_four);
- answers_three.add(a_three1);
- answers_three.add(a_four1);
- Quesition q_one=new Quesition();
- q_one.setQuesitionId("00");
- q_one.setType("0");
- q_one.setContent("1、您的性别:");
- q_one.setAnswers(answers_one);
- q_one.setQue_state(0);
- Quesition q_two=new Quesition();
- q_two.setQuesitionId("01");
- q_two.setType("1");
- q_two.setContent("2、您是党员吗?");
- q_two.setAnswers(answers_two);
- q_two.setQue_state(0);
- Quesition q_three=new Quesition();
- q_three.setQuesitionId("03");
- q_three.setType("1");
- q_three.setContent("3、您是dsfsdfsd吗?");
- q_three.setAnswers(answers_three);
- q_three.setQue_state(0);
- ArrayList<Quesition> quesitions=new ArrayList<Quesition>();
- quesitions.add(q_one);
- quesitions.add(q_two);
- quesitions.add(q_three);
- page=new Page();
- page.setPageId("000");
- page.setStatus("0");
- page.setTitle("第一次调查问卷");
- page.setQuesitions(quesitions);
- //加载布局
- initView(page);
- }
- private void initView(Page page) {
- // TODO Auto-generated method stub
- //这是要把问题的动态布局加入的布局
- test_layout=(LinearLayout)findViewById(R.id.lly_test);
- TextView page_txt=(TextView)findViewById(R.id.txt_title);
- page_txt.setText(page.getTitle());
- //获得问题即第二层的数据
- the_quesition_list=page.getQuesitions();
- //根据第二层问题的多少,来动态加载布局
- for(int i=0;i<the_quesition_list.size();i++){
- que_view=xInflater.inflate(R.layout.quesition_layout, null);
- TextView txt_que=(TextView)que_view.findViewById(R.id.txt_question_item);
- //这是第三层布局要加入的地方
- LinearLayout add_layout=(LinearLayout)que_view.findViewById(R.id.lly_answer);
- //判断单选-多选来实现后面是*号还是*多选,
- if(the_quesition_list.get(i).getType().equals("1")){
- set(txt_que,the_quesition_list.get(i).getContent(),1);
- }else{
- set(txt_que,the_quesition_list.get(i).getContent(),0);
- }
- //获得答案即第三层数据
- the_answer_list=the_quesition_list.get(i).getAnswers();
- imglist2=new ArrayList<ImageView>();
- for(int j=0;j<the_answer_list.size();j++){
- ans_view=xInflater.inflate(R.layout.answer_layout, null);
- TextView txt_ans=(TextView)ans_view.findViewById(R.id.txt_answer_item);
- ImageView image=(ImageView)ans_view.findViewById(R.id.image);
- View line_view=ans_view.findViewById(R.id.vw_line);
- if(j==the_answer_list.size()-1){
- //最后一条答案下面不要线是指布局的问题
- line_view.setVisibility(View.GONE);
- }
- //判断单选多选加载不同选项图片
- if(the_quesition_list.get(i).getType().equals("1")){
- image.setBackgroundDrawable(getResources().getDrawable(R.drawable.multiselect_false));
- }else{
- image.setBackgroundDrawable(getResources().getDrawable(R.drawable.radio_false));
- }
- Log.e("---", "------"+image);
- imglist2.add(image);
- txt_ans.setText(the_answer_list.get(j).getAnswer_content());
- LinearLayout lly_answer_size=(LinearLayout)ans_view.findViewById(R.id.lly_answer_size);
- lly_answer_size.setOnClickListener(new answerItemOnClickListener(i,j,the_answer_list,txt_ans));
- add_layout.addView(ans_view);
- }
- /*for(int r=0; r<imglist2.size();r++){
- Log.e("---", "imglist2--------"+imglist2.get(r));
- }*/
- imglist.add(imglist2);
- test_layout.addView(que_view);
- }
- /*for(int q=0;q<imglist.size();q++){
- for(int w=0;w<imglist.get(q).size();w++){
- Log.e("---", "共有------"+imglist.get(q).get(w));
- }
- }*/
- }
- private void set(TextView tv_test, String content,int type) {
- //为了加载问题后面的* 和*多选
- // TODO Auto-generated method stub
- String w;
- if(type==1){
- w = content+"*[多选题]";
- }else{
- w = content+"*";
- }
- int start = content.length();
- int end = w.length();
- Spannable word = new SpannableString(w);
- word.setSpan(new AbsoluteSizeSpan(25), start, end,
- Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- word.setSpan(new StyleSpan(Typeface.BOLD), start, end,
- Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- word.setSpan(new ForegroundColorSpan(Color.RED), start, end,
- Spannable.SPAN_INCLUSIVE_INCLUSIVE);
- tv_test.setText(word);
- }
- class answerItemOnClickListener implements OnClickListener{
- private int i;
- private int j;
- private TextView txt;
- private ArrayList<Answer> the_answer_lists;
- public answerItemOnClickListener(int i,int j, ArrayList<Answer> the_answer_list,TextView text){
- this.i=i;
- this.j=j;
- this.the_answer_lists=the_answer_list;
- this.txt=text;
- }
- //实现点击选项后改变选中状态以及对应图片
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- //判断当前问题是单选还是多选
- /*Log.e("------", "选择了-----第"+i+"题");
- for(int q=0;q<imglist.size();q++){
- for(int w=0;w<imglist.get(q).size();w++){
- // Log.e("---", "共有------"+imglist.get(q).get(w));
- }
- }
- Log.e("----", "点击了---"+imglist.get(i).get(j));*/
- if(the_quesition_list.get(i).getType().equals("1")){
- //多选
- if(the_answer_lists.get(j).getAns_state()==0){
- //如果未被选中
- txt.setTextColor(Color.parseColor("#EA5514"));
- imglist.get(i).get(j).setBackgroundDrawable(getResources().getDrawable(R.drawable.multiselect_true));
- the_answer_lists.get(j).setAns_state(1);
- the_quesition_list.get(i).setQue_state(1);
- }else{
- txt.setTextColor(Color.parseColor("#595757"));
- imglist.get(i).get(j).setBackgroundDrawable(getResources().getDrawable(R.drawable.multiselect_false));
- the_answer_lists.get(j).setAns_state(0);
- the_quesition_list.get(i).setQue_state(1);
- }
- }else{
- //单选
- for(int z=0;z<the_answer_lists.size();z++){
- the_answer_lists.get(z).setAns_state(0);
- imglist.get(i).get(z).setBackgroundDrawable(getResources().getDrawable(R.drawable.radio_false));
- }
- if(the_answer_lists.get(j).getAns_state()==0){
- //如果当前未被选中
- imglist.get(i).get(j).setBackgroundDrawable(getResources().getDrawable(R.drawable.radio_true));
- the_answer_lists.get(j).setAns_state(1);
- the_quesition_list.get(i).setQue_state(1);
- }else{
- //如果当前已被选中
- the_answer_lists.get(j).setAns_state(1);
- the_quesition_list.get(i).setQue_state(1);
- }
- }
- //判断当前选项是否选中
- }
- }
- class submitOnClickListener implements OnClickListener{
- private Page page;
- public submitOnClickListener(Page page){
- this.page=page;
- }
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- //判断是否答完题
- boolean isState=true;
- //最终要的json数组
- JSONArray jsonArray = new JSONArray();
- //点击提交的时候,先判断状态,如果有未答完的就提示,如果没有再把每条答案提交(包含问卷ID 问题ID 及答案ID)
- //注:不用管是否是一个问题的答案,就以答案的个数为准来提交上述格式的数据
- for(int i=0;i<the_quesition_list.size();i++){
- the_answer_list=the_quesition_list.get(i).getAnswers();
- //判断是否有题没答完
- if(the_quesition_list.get(i).getQue_state()==0){
- Toast.makeText(getApplicationContext(), "您第"+(i+1)+"题没有答完", Toast.LENGTH_LONG).show();
- jsonArray=null;
- isState=false;
- break;
- }else{
- for(int j=0;j<the_answer_list.size();j++){
- if(the_answer_list.get(j).getAns_state()==1){
- JSONObject json = new JSONObject();
- try {
- json.put("psychologicalId", page.getPageId());
- json.put("questionId", the_quesition_list.get(i).getQuesitionId());
- json.put("optionId", the_answer_list.get(j).getAnswerId());
- jsonArray.put(json);
- } catch (JSONException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- }
- }
- if(isState){
- if(jsonArray.length()>0){
- Log.e("af", jsonArray.toString());
- for(int item=0;item<jsonArray.length();item++){
- JSONObject job;
- try {
- job = jsonArray.getJSONObject(item);
- Log.e("----", "pageId--------"+job.get("pageId"));
- Log.e("----", "quesitionId--------"+job.get("quesitionId"));
- Log.e("----", "answerId--------"+job.get("answerId"));
- } catch (JSONException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } // 遍历 jsonarray 数组,把每一个对象转成 json 对象
- }
- }
- }
- }
- }
- }
人不能懒惰啊,以后要多多总结,欢迎大家讨论。