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 对象

					  }			

					}

			}

		}
	}

}

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

时间: 2024-10-25 17:32:29

android 实现调查问卷-单选-多选的相关文章

Android开发技巧——自定义单选或多选的ListView

这篇其实应该是属于写自定义单选或多选的ListView的基础教程,无奈目前许多人对此的实现大多都绕了远路,反而使得这正规的写法倒显得有些技巧性了. 本文原创,转载请注明在CSDN上的出处: http://blog.csdn.net/maosidiaoxian/article/details/45867927 Android中,ListView可以设置choiceMode,可见Android对ListView的单选或多选是有进行封装的,然而我看到的许多单选或多选的ListView,包括我以前写的例

JavasScript实现调查问卷插件

鄙人屌丝程序猿一枚,闲来无事,想尝试攻城师是感觉,于是乎搞了点小玩意.用js实现调查问卷,实现了常规的题型,单选,多选,排序,填空,矩阵等. 遂开源贴出来与各程序员共享,聊以自慰. 前台代码如下: 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Aim.Examining.Web.SurveyUI.Web

初识安卓小程序(开关灯——单选多选按钮控制)

如图: 点击单选按钮"开灯",多选按钮就会显示"关灯"且方块里有对勾:反之,点多选按钮,单选按钮也自动改变. 首先,先创建一个安卓项目(我的版本是4.4.2的),名字为"bulb",把两张图片:开灯与关灯状态的图片放入"drawable-"随意一个文件夹下 然后在res文件夹下找到layout文件夹,找到activity_main.xml或fragment_main.xml,在里面输入或拖拽按钮 <RelativeLay

“钱多多”软件用户调查问卷的调查报告

"钱多多"软件用户调查问卷   姓名:               学院:                  学号: 联系方式(QQ或者手机号):                (所有信息保密请大家放心填写) 性别:◎男   ◎女 1.你每个月的开销是 ◎500以下          ◎500-1000        ◎1000以上 2.你每个月的生活费一般都花在哪几个方面(多选) ◎吃喝 ◎服饰 ◎日用品 ◎手机话费流量等开销 ◎网购 ◎化妆 ◎电影 ◎旅游 ◎游戏 ◎其他 3.你每

调查问卷如何制作图片调查

单选图片调查 1.          首先建立个图片库上传图片 2.          选择单选题如下图: 格式如下: #img_start width="100" height="120" src="http://win-i07fillcfom:8003/DocLib2/1.jpg" #img_end 张三 #img_start width="100" height="120" src="htt

调查问卷实践总结

这次设计调查问卷的题目,我参与度不够.反思. 调查问卷的整个环节,从设计题目,到发布问卷,鼓动身边朋友同学去填写,最后对结果进行分析.走完这整个流程,还是和我想的有些不一样. 比如: 1.我以为填写问卷的都是生活背景,经历相似的同龄人,所以调查结果应该和作为开发者的我们想法差不多.但事实上,收集结果后,还是对结果有些许意外.果然,用户需求不好琢磨. 2.我不认为调查问卷是最好的收集用户需求信息的途径,作为同样曾“被调查的对象”,我就算看到弹出的所谓有奖填问卷的对话框也不会想去填.调查问卷调查不出

独立游戏开发调查问卷结果分析及设想实现

初步游戏设想为沙盒生存类,于是通过网络调查问卷稍微收集了27位用户的意见.总结如下 首先,在“爱玩的游戏类型”选项中,18/27的用户选择了RPG(角色扮演类型),占据了绝大多数.这个与我们游戏的开发设想一致——生存类本身就属于RPG的一种分支. 15/27人一天的游戏时间在1小时到3小时之间,所以游戏单次流程需要控制在两小时左右. 因为超过半数(16/27)的用户比较倾向于联机游戏,所以决定在游戏的单机部分完成后在其中加入局域网联机功能,可以选择合作或者对抗. 13/27的用户对于游戏的要求是

调查问卷与心得体会

现在我们已经到了软件项目中重要的需求分析阶段,也就是我们要做自己的需求文档.在此之前,我们就需要对用户或者目标客户的需求了解透彻.因此我们使用问卷调查来获得大量目标客户需求.在老师的教导下我们学会了调查表的制作,我觉得制作调查表的难度比分析调查问卷后的数据的难度要大得多,因为需要考虑很多问题. 由于没有经验,在设置问题上也很迷糊,不知道设置哪些问题,因为我们不知道我们要怎么设问才会收集到我们所需要的信息.老师给了我们几个要求: 1.不少于100份的有效数据: 2.分析有效数据并得到调查结果. 我

jQuery如何判断和设定单选多选是否选中??

  如何判断HTML中的单选多选是否选中呢?  这是web编程中最常用的判断,可是前段时间,却遇到了一个很奇怪的问题. 我想很多人会这样判断 if($("#weixuanzhong").attr("checked")=="checked")//选中时 { } 但如果是如下的HTML代码: <input type="checkbox" checked="checked" value="male