很久没写东西了,今天来总结下有关android调查问卷的需求实现。
转载请加地址:http://blog.csdn.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; } }建造这三个实体类的目的是为了在做demo的时候直接通过假数据来尽可能的贴近项目,使demo完成后能尽快的移植进项目。
下面来看看布局,总工用到了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>id为lly_test的布局就是最终要加入的目的布局
然后是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 对象 } } } } } }
人不能懒惰啊,以后要多多总结,欢迎大家讨论。