zoukankan      html  css  js  c++  java
  • android 实现调查问卷-单选-多选

    非常久没写东西了。今天来总结下有关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 对象
    					  			  
    					  }			
    				
    					}
    			
    			}
    		
    		}
    	}
    	
    }

    人不能懒惰啊,以后要多多总结。欢迎大家讨论。






  • 相关阅读:
    Delphi对象的产生和消亡过程
    WIN32的时空观
    PHP类的用法
    D7的System.pas单元的实现部分
    PHP的最简单用法
    C调用Lua
    js连连看
    动态属性的一个架构
    Entity Framework开源了
    apachesolr4.0.0ALPHA中文分析器IKAnalyzer4.0
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7279526.html
Copyright © 2011-2022 走看看