«

android 实现调查问卷-单选-多选

时间:2024-3-2 19:10     作者:韩俊     分类: 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 对象

                      }         

                    }

            }

        }
    }

}

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






标签: android

热门推荐