
由于这个模块内容较多,篇幅较长,请耐心阅读。
习题模块分为两个部分
- [x] 习题列表界面
- [x] 习题详情界面
一、习题列表界面
1、习题界面
(1)、创建习题界面
在res/layout文件夹中,新建一个布局文件,命名为main_view_exercises。
(2)、导入界面图片
将习题界面所需图片 exercises_bg_1.png、exercises_bg_2.png、exercises_bg_3.png、exercises_bg_4.png导入drawable文件夹中。
(3)、习题界面代码main_view_exercises.xml
1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:background="@android:color/white"> 7 8 <ListView 9 android:id="@+id/lv_list" 10 android:layout_width="fill_parent" 11 android:layout_height="fill_parent" 12 android:layout_marginBottom="55dp" 13 android:divider="#E4E4E4" 14 android:dividerHeight="1dp"/> 15</LinearLayout>
2、习题界面Item
由于习题界面使用了ListView控件,所以需要创建一个Item界面。在res/layout文件夹中,新建一个布局文件,命名为exercises_list_item。代码如下:
1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="horizontal" 4 android:layout_width="fill_parent" 5 android:layout_height="wrap_content" 6 android:background="@android:color/white" 7 android:paddingBottom="15dp" 8 android:paddingLeft="10dp" 9 android:paddingRight="10dp" 10 android:paddingTop="15dp"> 11 <TextView 12 android:id="@+id/tv_order" 13 android:layout_width="40dp" 14 android:layout_height="40dp" 15 android:layout_gravity="center_vertical" 16 android:layout_marginLeft="10dp" 17 android:background="@drawable/exercises_bg_1" 18 android:gravity="center" 19 android:textColor="@android:color/white" 20 android:textSize="16sp"/> 21 <LinearLayout 22 android:layout_width="fill_parent" 23 android:layout_height="fill_parent" 24 android:layout_marginLeft="15dp" 25 android:gravity="center_vertical" 26 android:orientation="vertical"> 27 <TextView 28 android:id="@+id/tv_title" 29 android:layout_width="wrap_content" 30 android:layout_height="wrap_content" 31 android:singleLine="true" 32 android:textColor="#000000" 33 android:textSize="14sp"/> 34 <TextView 35 android:id="@+id/tv_content" 36 android:layout_width="wrap_content" 37 android:layout_height="wrap_content" 38 android:layout_marginTop="2dp" 39 android:singleLine="true" 40 android:textColor="#a3a3a3" 41 android:textSize="12sp"/> 42 </LinearLayout> 43</LinearLayout>
3、创建ExerciseBean类
在com.bocuegu.bean包中新建一个java类,命名为ExerciseBean。用来创建习题所有的属性。代码如下:
1package com.boxuegu.bean; 2 3public class ExercisesBean { 4 public int id; //每章习题ID 5 public String title; //每章习题标题 6 public String content; //每章习题的数目 7 public int background; //每章习题前边的序列背景 8 public int subjectId; //每道习题的ID 9 public String subject; //每道习题的题干 10 public String a; //每道习题的A选项 11 public String b; //每道习题的B选项 12 public String c; //每道习题的C选项 13 public String d; //每道习题的D选项 14 public int answer; //每道习题的正确答案 15 /* 16 * select为 0,1,2,3,4,的含义: 17 * 0时表示所选选项是对的 18 * 1表示选项中的A是错误的 19 * 2表示选项中的B是错误的 20 * 3表示选项中的C是错误的 21 * 4表示选项中的D是错误的 22 */ 23 public int select; 24}
4、习题界面Adapter
选择com.boxuegu包,创建adapter包。在adapter包中创建一个Java类,命名为ExercisesAdapter。由于ExercisesAdapter类继承自BaseAdapter类,所以要修改主类,代码如下:
1package com.boxuegu.adapter; 2 3import android.content.Context; 4import android.content.Intent; 5import com.boxuegu.R; 6import com.boxuegu.activity.ExercisesDetailActivity; 7import com.boxuegu.bean.ExercisesBean; 8import android.view.LayoutInflater; 9import android.view.View; 10import android.view.ViewGroup; 11import android.widget.BaseAdapter; 12import android.widget.TextView; 13 14import java.util.List; 15 16//ExercisesAdapter类继承自BaseAdapter类 17public class ExercisesAdapter extends BaseAdapter { 18 private Context mContext; 19 private List<ExercisesBean> ebl; 20 public ExercisesAdapter(Context context){ 21 this.mContext = context; 22 } 23 24 //设置数据更新界面 25 public void setData(List<ExercisesBean> ebl){ 26 this.ebl = ebl; 27 notifyDataSetChanged(); 28 } 29 30 //获取Item的总数 31 @Override 32 public int getCount() { 33 return ebl == null?0:ebl.size(); 34 } 35 36 //根据position得到对应Item的对象 37 @Override 38 public ExercisesBean getItem(int position) { 39 return ebl == null ? null : ebl.get(position); 40 } 41 42 //根据position得到对应Item的ID 43 @Override 44 public long getItemId(int position) { 45 return position; 46 } 47 48 //根据position得到对应Item的视图,position是当前Item的位置 49 @Override 50 public View getView(int position, View convertView, ViewGroup parent) { 51 final ViewHolder vh; 52 //复用convertView 53 if (convertView == null){ 54 vh = new ViewHolder(); 55 convertView = LayoutInflater.from(mContext).inflate(R.layout.exercises_list_item,null); 56 vh.title = (TextView) convertView.findViewById(R.id.tv_title); 57 vh.content = (TextView) convertView.findViewById(R.id.tv_content); 58 vh.order = (TextView) convertView.findViewById(R.id.tv_order); 59 convertView.setTag(vh); 60 }else { 61 vh = (ViewHolder) convertView.getTag(); 62 } 63 //获取position对应的Item的数据对象 64 final ExercisesBean bean = getItem(position); 65 if (bean != null){ 66 vh.order.setText(position + 1 + ""); 67 vh.title.setText(bean.title); 68 vh.content.setText(bean.content); 69 vh.order.setBackgroundResource(bean.background); 70 } 71 //每个Item的点击事件 72 convertView.setOnClickListener(new View.OnClickListener(){ 73 @Override 74 public void onClick(View v){ 75 if (bean == null) 76 return; 77 //跳转到习题详情界面 后面添加 78 Intent intent = new Intent(mContext, ExercisesDetailActivity.class); 79 intent.putExtra("id",bean.id); 80 intent.putExtra("title",bean.title); 81 mContext.startActivity(intent); 82 } 83 }); 84 return convertView; 85 } 86 class ViewHolder{ 87 public TextView title,content; 88 public TextView order; 89 } 90}
5、习题界面逻辑代码
在com.boxuegu.view包中创建一个ExercisesView的Java类。
1package com.boxuegu.view; 2 3import android.app.Activity; 4import com.boxuegu.R; 5import com.boxuegu.adapter.ExercisesAdapter; 6import com.boxuegu.bean.ExercisesBean; 7import android.view.LayoutInflater; 8import android.view.View; 9import android.widget.ListView; 10 11import java.util.ArrayList; 12import java.util.List; 13 14 15public class ExercisesView { 16 private ListView lv_list; 17 private ExercisesAdapter adapter; 18 private List<ExercisesBean> ebl; 19 private Activity mContext; 20 private LayoutInflater mInflater; 21 private View mCurrentView; 22 public ExercisesView(Activity context){ 23 mContext = context; 24 mInflater = LayoutInflater.from(mContext); 25 } 26 private void createView(){ 27 initView(); 28 } 29 private void initView(){ 30 mCurrentView = mInflater.inflate(R.layout.main_view_exercises,null); 31 lv_list = (ListView) mCurrentView.findViewById(R.id.lv_list); 32 adapter = new ExercisesAdapter(mContext); 33 initData(); 34 adapter.setData(ebl); 35 lv_list.setAdapter(adapter); 36 } 37 38 //设置数据 39 private void initData(){ 40 ebl = new ArrayList<ExercisesBean>(); 41 for (int i=0;i<10;i++){ 42 ExercisesBean bean = new ExercisesBean(); 43 bean.id = (i+1); 44 switch (i){ 45 case 0: 46 bean.title = "第1章 博客(网站)简介"; 47 bean.content="共计5题"; 48 bean.background=(R.drawable.exercises_bg_1); 49 break; 50 case 1: 51 bean.title = "第2章 认识WordPress"; 52 bean.content="共计5题"; 53 bean.background=(R.drawable.exercises_bg_2); 54 break; 55 case 2: 56 bean.title = "第3章 WordPress基础"; 57 bean.content="共计5题"; 58 bean.background=(R.drawable.exercises_bg_3); 59 break; 60 case 3: 61 bean.title = "第4章 熟悉Linux系统"; 62 bean.content="共计5题"; 63 bean.background=(R.drawable.exercises_bg_4); 64 break; 65 case 4: 66 bean.title = "第5章 PHP基本语法"; 67 bean.content="共计5题"; 68 bean.background=(R.drawable.exercises_bg_1); 69 break; 70 case 5: 71 bean.title = "第6章 MySQL数据库"; 72 bean.content="共计5题"; 73 bean.background=(R.drawable.exercises_bg_2); 74 break; 75 case 6: 76 bean.title = "第7章 Nginx服务器"; 77 bean.content="共计5题"; 78 bean.background=(R.drawable.exercises_bg_3); 79 break; 80 case 7: 81 bean.title = "第8章 云服务器简介"; 82 bean.content="共计5题"; 83 bean.background=(R.drawable.exercises_bg_4); 84 break; 85 case 8: 86 bean.title = "第9章 环境搭建过程"; 87 bean.content="共计5题"; 88 bean.background=(R.drawable.exercises_bg_1); 89 break; 90 case 9: 91 bean.title = "第10章 WordPress主题"; 92 bean.content="共计5题"; 93 bean.background=(R.drawable.exercises_bg_2); 94 break; 95 default: 96 break; 97 } 98 ebl.add(bean); 99 } 100 } 101 102 //获取当前在导航栏上方显示对应的view 103 public View getView(){ 104 if (mCurrentView == null){ 105 createView(); 106 } 107 return mCurrentView; 108 } 109 110 //显示当前导航栏上方所对应的view界面 111 public void showView(){ 112 if (mCurrentView == null) { 113 createView(); 114 } 115 mCurrentView.setVisibility(View.VISIBLE); 116 } 117 118}
6、修改底部导航栏代码
因为习题界面是通过底部导航栏进行跳转的,找到MainActivity.java文件的private RelativeLayout rl_title_bar;,在下方添加:
private ExercisesView mExerciseView;
找到MainActivity.java文件的createView()方法,在注释//习题界面下方添加如下代码:
1if (mExerciseView == null){ 2 mExerciseView = new ExercisesView(this); 3 mBodyLayout.addView(mExerciseView.getView()); 4 }else{ 5 mExerciseView.getView(); 6 } 7 mExerciseView.showView();
二、习题详情界面
1、创建界面
(1)、创建习题详情界面
在com.boxuegu.activity中创建一个Java类,命名为ExercisesDetailActivity。在res/layout文件夹下创建一个布局文件,命名为activity_exercises_detail。
(2)、导入界面图片 exercises_a.png、exercises_b.png、exercises_c.png、exercises_d.png、exercises_error_icon.png、exercises_right_icon.png。
(3)、界面代码activity_exercises_detail.xml
1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:background="@android:color/white"> 7 8 <include layout="@layout/main_title_bar" /> 9 10 <TextView 11 android:layout_width="fill_parent" 12 android:layout_height="wrap_content" 13 android:layout_marginLeft="10dp" 14 android:layout_marginTop="15dp" 15 android:text="一、选择题" 16 android:textColor="#000000" 17 android:textSize="16sp" 18 android:textStyle="bold" 19 android:visibility="gone"/> 20 <ListView 21 android:layout_width="fill_parent" 22 android:layout_height="fill_parent" 23 android:id="@+id/lv_list" 24 android:divider="@null"/> 25 26</LinearLayout>
2、习题详情界面Item
在res/layout文件夹中创建一个布局文件,命名为exercises_detail_list_item。代码如下:
1<?xml version="1.0" encoding="utf-8"?> 2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" 6 android:background="@android:color/white" 7 android:padding="15dp"> 8 9 <TextView 10 android:id="@+id/tv_subject" 11 android:layout_width="fill_parent" 12 android:layout_height="wrap_content" 13 android:lineSpacingMultiplier="1.5" 14 android:textColor="#000000" 15 android:textSize="14sp"/> 16 <LinearLayout 17 android:layout_width="fill_parent" 18 android:layout_height="wrap_content" 19 android:layout_marginTop="15dp" 20 android:orientation="horizontal"> 21 <ImageView 22 android:id="@+id/iv_a" 23 android:layout_width="35dp" 24 android:layout_height="35dp" 25 android:src="@drawable/exercises_a"/> 26 <TextView 27 android:id="@+id/tv_a" 28 android:layout_width="fill_parent" 29 android:layout_height="wrap_content" 30 android:layout_gravity="center_vertical" 31 android:layout_marginLeft="8dp" 32 android:lineSpacingMultiplier="1.5" 33 android:textColor="#000000" 34 android:textSize="12sp"/> 35 </LinearLayout> 36 <LinearLayout 37 android:layout_width="fill_parent" 38 android:layout_height="wrap_content" 39 android:layout_marginTop="15dp" 40 android:orientation="horizontal"> 41 <ImageView 42 android:id="@+id/iv_b" 43 android:layout_width="35dp" 44 android:layout_height="35dp" 45 android:src="@drawable/exercises_b"/> 46 <TextView 47 android:id="@+id/tv_b" 48 android:layout_width="fill_parent" 49 android:layout_height="wrap_content" 50 android:layout_gravity="center_vertical" 51 android:layout_marginLeft="8dp" 52 android:lineSpacingMultiplier="1.5" 53 android:textColor="#000000" 54 android:textSize="12sp"/> 55 </LinearLayout> 56 <LinearLayout 57 android:layout_width="fill_parent" 58 android:layout_height="wrap_content" 59 android:layout_marginTop="15dp" 60 android:orientation="horizontal"> 61 <ImageView 62 android:id="@+id/iv_c" 63 android:layout_width="35dp" 64 android:layout_height="35dp" 65 android:src="@drawable/exercises_c"/> 66 <TextView 67 android:id="@+id/tv_c" 68 android:layout_width="fill_parent" 69 android:layout_height="wrap_content" 70 android:layout_gravity="center_vertical" 71 android:layout_marginLeft="8dp" 72 android:lineSpacingMultiplier="1.5" 73 android:textColor="#000000" 74 android:textSize="12sp"/> 75 </LinearLayout> 76 <LinearLayout 77 android:layout_width="fill_parent" 78 android:layout_height="wrap_content" 79 android:layout_marginTop="15dp" 80 android:orientation="horizontal"> 81 <ImageView 82 android:id="@+id/iv_d" 83 android:layout_width="35dp" 84 android:layout_height="35dp" 85 android:src="@drawable/exercises_d"/> 86 <TextView 87 android:id="@+id/tv_d" 88 android:layout_width="fill_parent" 89 android:layout_height="wrap_content" 90 android:layout_gravity="center_vertical" 91 android:layout_marginLeft="8dp" 92 android:lineSpacingMultiplier="1.5" 93 android:textColor="#000000" 94 android:textSize="12sp"/> 95 </LinearLayout> 96</LinearLayout> 97
3、习题数据的存放
(1)、如果没有assets文件夹则创建一个。
(2)、在assets文件夹下创建xml文件用来存放习题内容。
因为有10个章节的内容,所以要创建10个xml文件。这里演示一个,其余9个依次类推。注意,这里创建的是xml文件,不是android xml文件。

1<?xml version="1.0" encoding="UTF-8"?> 2<infos> 3 <exercises id="1"> 4 <subject>1.下列哪个选项属于一个网站()。</subject> 5 <a>百度APP</a> 6 <b>腾讯网</b> 7 <c>谷歌浏览器</c> 8 <d>Eclipse</d> 9 <answer>2</answer> 10 </exercises> 11 <exercises id="2"> 12 <subject>2.个人博客的英文简称()。</subject> 13 <a>Eclipse</a> 14 <b>SDK</b> 15 <c>SDK Manager.exe</c> 16 <d>blog</d> 17 <answer>4</answer> 18 </exercises> 19 <exercises id="3"> 20 <subject>3.CMS系统属于什么类型的网站系统()。</subject> 21 <a>纯静态</a> 22 <b>纯动态</b> 23 <c>伪静态</c> 24 <d>以上都不对</d> 25 <answer>2</answer> 26 </exercises> 27 <exercises id="4"> 28 <subject>4.个人博客与网站的关系()。</subject> 29 <a>博客属于网站</a> 30 <b>网站属于博客</b> 31 <c>静态网站属于博客</c> 32 <d>静态博客属于网站</d> 33 <answer>1</answer> 34 </exercises> 35 <exercises id="5"> 36 <subject>5.动态博客有哪些功能()。</subject> 37 <a>发布文章</a> 38 <b>留言评论</b> 39 <c>后台管理</c> 40 <d>以上都对</d> 41 <answer>4</answer> 42 </exercises> 43</infos>
(3)、解析xml文件
找到AnalysisUtils.java文件,添加以下代码用来解析XML文件:
1//解析XML文件 2 public static List<ExercisesBean> getExercisesInfos(InputStream is) throws Exception{ 3 XmlPullParser parser = Xml.newPullParser(); 4 parser.setInput(is,"utf-8"); 5 List<ExercisesBean> exercisesInfos = null; 6 ExercisesBean exercisesInfo = null; 7 int type = parser.getEventType(); 8 while (type!=XmlPullParser.END_DOCUMENT){ 9 switch (type){ 10 case XmlPullParser.START_TAG: 11 if ("infos".equals(parser.getName())){ 12 exercisesInfos = new ArrayList<ExercisesBean>(); 13 }else if ("exercises".equals(parser.getName())){ 14 exercisesInfo = new ExercisesBean(); 15 String ids = parser.getAttributeValue(0); 16 exercisesInfo.subjectId = Integer.parseInt(ids); 17 }else if ("subject".equals(parser.getName())){ 18 String subject = parser.nextText(); 19 exercisesInfo.subject=subject; 20 }else if ("a".equals(parser.getName())){ 21 String a = parser.nextText(); 22 exercisesInfo.a=a; 23 }else if ("b".equals(parser.getName())){ 24 String b = parser.nextText(); 25 exercisesInfo.b=b; 26 }else if ("c".equals(parser.getName())){ 27 String c = parser.nextText(); 28 exercisesInfo.c=c; 29 }else if ("d".equals(parser.getName())){ 30 String d = parser.nextText(); 31 exercisesInfo.d=d; 32 }else if ("answer".equals(parser.getName())){ 33 String answer = parser.nextText(); 34 exercisesInfo.answer=Integer.parseInt(answer); 35 } 36 break; 37 case XmlPullParser.END_TAG: 38 if ("exercises".equals(parser.getName())){ 39 exercisesInfos.add(exercisesInfo); 40 exercisesInfo=null; 41 } 42 break; 43 } 44 type=parser.next(); 45 } 46 return exercisesInfos; 47 }
4、习题详情界面Adapter
在com.boxuegu.adapter包中创建一个Java类,命名为ExrecisesDetailAdapter。代码如下:
1package com.boxuegu.adapter; 2 3import android.content.Context; 4import com.boxuegu.R; 5import com.boxuegu.bean.ExercisesBean; 6import com.boxuegu.utils.AnalysisUtils; 7import android.view.LayoutInflater; 8import android.view.View; 9import android.view.ViewGroup; 10import android.widget.BaseAdapter; 11import android.widget.ImageView; 12import android.widget.TextView; 13 14import java.util.ArrayList; 15import java.util.List; 16 17 18public class ExrecisesDetailAdapter extends BaseAdapter { 19 private Context mContext; 20 private List<ExercisesBean> ebl; 21 private OnSelectListener onSelectListener; 22 public ExrecisesDetailAdapter(Context context,OnSelectListener onSelectListener){ 23 this.mContext = context; 24 this.onSelectListener = onSelectListener; 25 } 26 public void setData(List<ExercisesBean> ebl){ 27 this.ebl = ebl; 28 notifyDataSetChanged(); 29 } 30 @Override 31 public int getCount() { 32 return ebl == null ? 0 : ebl.size(); 33 } 34 35 @Override 36 public ExercisesBean getItem(int position) { 37 return ebl == null?null:ebl.get(position); 38 } 39 40 @Override 41 public long getItemId(int position) { 42 return position; 43 } 44 45 //记录点击的位置 46 private ArrayList<String> selectedPosition = new ArrayList<String>(); 47 48 @Override 49 public View getView(final int position, View convertView, final ViewGroup parent) { 50 final ViewHolder vh; 51 if (convertView == null){ 52 vh = new ViewHolder(); 53 convertView = LayoutInflater.from(mContext).inflate(R.layout.exercises_detail_list_item,null); 54 vh.subject = (TextView) convertView.findViewById(R.id.tv_subject); 55 vh.tv_a = (TextView) convertView.findViewById(R.id.tv_a); 56 vh.tv_b = (TextView) convertView.findViewById(R.id.tv_b); 57 vh.tv_c = (TextView) convertView.findViewById(R.id.tv_c); 58 vh.tv_d = (TextView) convertView.findViewById(R.id.tv_d); 59 vh.iv_a = (ImageView) convertView.findViewById(R.id.iv_a); 60 vh.iv_b = (ImageView) convertView.findViewById(R.id.iv_b); 61 vh.iv_c = (ImageView) convertView.findViewById(R.id.iv_c); 62 vh.iv_d = (ImageView) convertView.findViewById(R.id.iv_d); 63 convertView.setTag(vh); 64 }else { 65 vh=(ViewHolder) convertView.getTag(); 66 } 67 final ExercisesBean bean = getItem(position); 68 if (bean != null){ 69 vh.subject.setText(bean.subject); 70 vh.tv_a.setText(bean.a); 71 vh.tv_b.setText(bean.b); 72 vh.tv_c.setText(bean.c); 73 vh.tv_d.setText(bean.d); 74 } 75 if (!selectedPosition.contains("" + position)){ 76 vh.iv_a.setImageResource(R.drawable.exercises_a); 77 vh.iv_b.setImageResource(R.drawable.exercises_b); 78 vh.iv_c.setImageResource(R.drawable.exercises_c); 79 vh.iv_d.setImageResource(R.drawable.exercises_d); 80 AnalysisUtils.setABCDEnable(true,vh.iv_a,vh.iv_b,vh.iv_c,vh.iv_d); 81 }else { 82 AnalysisUtils.setABCDEnable(false,vh.iv_a,vh.iv_b,vh.iv_c,vh.iv_d); 83 switch (bean.select){ 84 case 0: //用户所选选项是正确的 85 if (bean.answer == 1){ 86 vh.iv_a.setImageResource(R.drawable.exercises_right_icon); 87 vh.iv_b.setImageResource(R.drawable.exercises_b); 88 vh.iv_c.setImageResource(R.drawable.exercises_c); 89 vh.iv_d.setImageResource(R.drawable.exercises_d); 90 }else if (bean.answer == 2){ 91 vh.iv_a.setImageResource(R.drawable.exercises_a); 92 vh.iv_b.setImageResource(R.drawable.exercises_right_icon); 93 vh.iv_c.setImageResource(R.drawable.exercises_c); 94 vh.iv_d.setImageResource(R.drawable.exercises_d); 95 }else if (bean.answer == 3){ 96 vh.iv_a.setImageResource(R.drawable.exercises_a); 97 vh.iv_b.setImageResource(R.drawable.exercises_b); 98 vh.iv_c.setImageResource(R.drawable.exercises_right_icon); 99 vh.iv_d.setImageResource(R.drawable.exercises_d); 100 }else if (bean.answer == 4){ 101 vh.iv_a.setImageResource(R.drawable.exercises_a); 102 vh.iv_b.setImageResource(R.drawable.exercises_b); 103 vh.iv_c.setImageResource(R.drawable.exercises_c); 104 vh.iv_d.setImageResource(R.drawable.exercises_right_icon); 105 } 106 break; 107 case 1: //用户所选选项A是错误的 108 vh.iv_a.setImageResource(R.drawable.exercises_error_icon); 109 if (bean.answer == 2){ 110 vh.iv_b.setImageResource(R.drawable.exercises_right_icon); 111 vh.iv_c.setImageResource(R.drawable.exercises_c); 112 vh.iv_d.setImageResource(R.drawable.exercises_d); 113 }else if (bean.answer == 3){ 114 vh.iv_b.setImageResource(R.drawable.exercises_b); 115 vh.iv_c.setImageResource(R.drawable.exercises_right_icon); 116 vh.iv_d.setImageResource(R.drawable.exercises_d); 117 }else if (bean.answer == 4){ 118 vh.iv_b.setImageResource(R.drawable.exercises_b); 119 vh.iv_c.setImageResource(R.drawable.exercises_c); 120 vh.iv_d.setImageResource(R.drawable.exercises_right_icon); 121 } 122 break; 123 case 2: //用户所选选项B是错误的 124 vh.iv_b.setImageResource(R.drawable.exercises_error_icon); 125 if (bean.answer == 1){ 126 vh.iv_a.setImageResource(R.drawable.exercises_right_icon); 127 vh.iv_c.setImageResource(R.drawable.exercises_c); 128 vh.iv_d.setImageResource(R.drawable.exercises_d); 129 }else if (bean.answer == 3){ 130 vh.iv_a.setImageResource(R.drawable.exercises_a); 131 vh.iv_c.setImageResource(R.drawable.exercises_right_icon); 132 vh.iv_d.setImageResource(R.drawable.exercises_d); 133 }else if (bean.answer == 4){ 134 vh.iv_a.setImageResource(R.drawable.exercises_a); 135 vh.iv_c.setImageResource(R.drawable.exercises_c); 136 vh.iv_d.setImageResource(R.drawable.exercises_right_icon); 137 } 138 break; 139 case 3: //用户所选选项C是错误的 140 vh.iv_c.setImageResource(R.drawable.exercises_error_icon); 141 if (bean.answer == 1){ 142 vh.iv_a.setImageResource(R.drawable.exercises_right_icon); 143 vh.iv_b.setImageResource(R.drawable.exercises_b); 144 vh.iv_d.setImageResource(R.drawable.exercises_d); 145 }else if (bean.answer == 2){ 146 vh.iv_a.setImageResource(R.drawable.exercises_a); 147 vh.iv_b.setImageResource(R.drawable.exercises_right_icon); 148 vh.iv_d.setImageResource(R.drawable.exercises_d); 149 }else if (bean.answer == 4){ 150 vh.iv_a.setImageResource(R.drawable.exercises_a); 151 vh.iv_b.setImageResource(R.drawable.exercises_b); 152 vh.iv_d.setImageResource(R.drawable.exercises_right_icon); 153 } 154 break; 155 case 4: //用户所选选项D是错误的 156 vh.iv_c.setImageResource(R.drawable.exercises_error_icon); 157 if (bean.answer == 1){ 158 vh.iv_a.setImageResource(R.drawable.exercises_right_icon); 159 vh.iv_b.setImageResource(R.drawable.exercises_b); 160 vh.iv_c.setImageResource(R.drawable.exercises_c); 161 }else if (bean.answer == 2){ 162 vh.iv_a.setImageResource(R.drawable.exercises_a); 163 vh.iv_b.setImageResource(R.drawable.exercises_right_icon); 164 vh.iv_c.setImageResource(R.drawable.exercises_c); 165 }else if (bean.answer == 3){ 166 vh.iv_a.setImageResource(R.drawable.exercises_a); 167 vh.iv_b.setImageResource(R.drawable.exercises_b); 168 vh.iv_c.setImageResource(R.drawable.exercises_right_icon); 169 } 170 break; 171 default: 172 break; 173 } 174 } 175 176 //当用户点击A选项的点击事件 177 vh.iv_a.setOnClickListener(new View.OnClickListener(){ 178 @Override 179 public void onClick(View v){ 180 if (selectedPosition.contains("" + position)){ 181 selectedPosition.remove("" + position); 182 }else { 183 selectedPosition.add(position + ""); 184 } 185 onSelectListener.onSelectA(position,vh.iv_a,vh.iv_b,vh.iv_c,vh.iv_d); 186 } 187 }); 188 189 //当用户点击B选项的点击事件 190 vh.iv_b.setOnClickListener(new View.OnClickListener(){ 191 @Override 192 public void onClick(View v){ 193 if (selectedPosition.contains("" + position)){ 194 selectedPosition.remove("" + position); 195 }else { 196 selectedPosition.add(position + ""); 197 } 198 onSelectListener.onSelectA(position,vh.iv_a,vh.iv_b,vh.iv_c,vh.iv_d); 199 } 200 }); 201 202 //当用户点击C选项的点击事件 203 vh.iv_c.setOnClickListener(new View.OnClickListener(){ 204 @Override 205 public void onClick(View v){ 206 if (selectedPosition.contains("" + position)){ 207 selectedPosition.remove("" + position); 208 }else { 209 selectedPosition.add(position + ""); 210 } 211 onSelectListener.onSelectA(position,vh.iv_a,vh.iv_b,vh.iv_c,vh.iv_d); 212 } 213 }); 214 215 //当用户点击D选项的点击事件 216 vh.iv_d.setOnClickListener(new View.OnClickListener(){ 217 @Override 218 public void onClick(View v){ 219 if (selectedPosition.contains("" + position)){ 220 selectedPosition.remove("" + position); 221 }else { 222 selectedPosition.add(position + ""); 223 } 224 onSelectListener.onSelectA(position,vh.iv_a,vh.iv_b,vh.iv_c,vh.iv_d); 225 } 226 }); 227 return convertView; 228 } 229 class ViewHolder{ 230 public TextView subject,tv_a,tv_b,tv_c,tv_d; 231 public ImageView iv_a,iv_b,iv_c,iv_d; 232 } 233 public interface OnSelectListener{ 234 void onSelectA(int position,ImageView iv_a,ImageView iv_b,ImageView iv_c,ImageView iv_d); 235 void onSelectB(int position,ImageView iv_a,ImageView iv_b,ImageView iv_c,ImageView iv_d); 236 void onSelectC(int position,ImageView iv_a,ImageView iv_b,ImageView iv_c,ImageView iv_d); 237 void onSelectD(int position,ImageView iv_a,ImageView iv_b,ImageView iv_c,ImageView iv_d); 238 } 239}
5、习题详情界面逻辑代码——ExercisesDetailActivity.java
1package com.boxuegu.activity; 2 3import android.content.pm.ActivityInfo; 4import com.boxuegu.R; 5import com.boxuegu.adapter.ExrecisesDetailAdapter; 6import com.boxuegu.bean.ExercisesBean; 7import com.boxuegu.utils.AnalysisUtils; 8import android.graphics.Color; 9import android.os.Bundle; 10import android.support.v7.app.AppCompatActivity; 11import android.support.v7.widget.LinearLayoutCompat; 12import android.view.View; 13import android.widget.ImageView; 14import android.widget.ListView; 15import android.widget.RelativeLayout; 16import android.widget.TextView; 17 18 19import java.io.InputStream; 20import java.util.ArrayList; 21import java.util.List; 22 23 24 25public class ExercisesDetailActivity extends AppCompatActivity { 26 private TextView tv_main_title; 27 private TextView tv_back; 28 private RelativeLayout rl_title_bar; 29 private ListView lv_list; 30 private String title; 31 private int id; 32 private List<ExercisesBean> ebl; 33 private ExrecisesDetailAdapter adapter; 34 35 @Override 36 protected void onCreate(Bundle savedInstanceState){ 37 super.onCreate(savedInstanceState); 38 setContentView(R.layout.activity_exercises_detail); 39 //设置界面为竖屏 40 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 41 //获取从习题界面传递过来的章节ID 42 id = getIntent().getIntExtra("id",0); 43 //获取从习题界面传递过来的章节标题 44 title = getIntent().getStringExtra("title"); 45 ebl = new ArrayList<ExercisesBean>(); 46 initData(); 47 init(); 48 } 49 private void initData(){ 50 try { 51 //从XML文件中获取习题数据 52 InputStream is = getResources().getAssets().open("chapter" + id +".xml"); 53 ebl = AnalysisUtils.getExercisesInfos(is); 54 } catch (Exception e) { 55 e.printStackTrace(); 56 } 57 } 58 59 //初始化控件 60 private void init(){ 61 tv_main_title = (TextView) findViewById(R.id.tv_main_title); 62 tv_back = (TextView) findViewById(R.id.tv_back); 63 rl_title_bar = (RelativeLayout) findViewById(R.id.title_bar); 64 rl_title_bar.setBackgroundColor(Color.parseColor("#30B4FF")); 65 lv_list = (ListView)findViewById(R.id.lv_list); 66 TextView tv = new TextView(this); 67 tv.setTextColor(Color.parseColor("#000000")); 68 tv.setTextSize(16.0f); 69 tv.setText("第一部分、选择题(单选)"); 70 tv.setPadding(10,15,0,0); 71 lv_list.addHeaderView(tv); 72 tv_main_title.setText(title); 73 tv_back.setOnClickListener(new View.OnClickListener(){ 74 @Override 75 public void onClick(View v){ 76 ExercisesDetailActivity.this.finish(); 77 } 78 }); 79 adapter = new ExrecisesDetailAdapter(ExercisesDetailActivity.this,new ExrecisesDetailAdapter.OnSelectListener(){ 80 @Override 81 public void onSelectD(int postion, ImageView iv_a, ImageView iv_b, ImageView iv_c, ImageView iv_d){ 82 //判断如果答案不是4即D答案 83 if (ebl.get(postion).answer != 4){ 84 ebl.get(postion).select=4; 85 }else { 86 ebl.get(postion).select = 0; 87 } 88 switch (ebl.get(postion).answer){ 89 case 1: 90 iv_a.setImageResource(R.drawable.exercises_right_icon); 91 iv_d.setImageResource(R.drawable.exercises_error_icon); 92 break; 93 case 2: 94 iv_b.setImageResource(R.drawable.exercises_right_icon); 95 iv_d.setImageResource(R.drawable.exercises_error_icon); 96 break; 97 case 3: 98 iv_c.setImageResource(R.drawable.exercises_right_icon); 99 iv_d.setImageResource(R.drawable.exercises_error_icon); 100 break; 101 case 4: 102 iv_d.setImageResource(R.drawable.exercises_right_icon); 103 break; 104 } 105 AnalysisUtils.setABCDEnable(false,iv_a,iv_b,iv_c,iv_d); 106 } 107 @Override 108 public void onSelectC(int postion, ImageView iv_a, ImageView iv_b, ImageView iv_c, ImageView iv_d){ 109 //判断如果答案不是3即C答案 110 if (ebl.get(postion).answer != 3){ 111 ebl.get(postion).select=3; 112 }else { 113 ebl.get(postion).select = 0; 114 } 115 switch (ebl.get(postion).answer){ 116 case 1: 117 iv_a.setImageResource(R.drawable.exercises_right_icon); 118 iv_c.setImageResource(R.drawable.exercises_error_icon); 119 break; 120 case 2: 121 iv_b.setImageResource(R.drawable.exercises_right_icon); 122 iv_c.setImageResource(R.drawable.exercises_error_icon); 123 break; 124 case 3: 125 iv_c.setImageResource(R.drawable.exercises_right_icon); 126 break; 127 case 4: 128 iv_c.setImageResource(R.drawable.exercises_error_icon); 129 iv_d.setImageResource(R.drawable.exercises_right_icon); 130 break; 131 } 132 AnalysisUtils.setABCDEnable(false,iv_a,iv_b,iv_c,iv_d); 133 } 134 @Override 135 public void onSelectB(int postion, ImageView iv_a, ImageView iv_b, ImageView iv_c, ImageView iv_d){ 136 //判断如果答案不是2即B答案 137 if (ebl.get(postion).answer != 2){ 138 ebl.get(postion).select=2; 139 }else { 140 ebl.get(postion).select = 0; 141 } 142 switch (ebl.get(postion).answer){ 143 case 1: 144 iv_a.setImageResource(R.drawable.exercises_right_icon); 145 iv_b.setImageResource(R.drawable.exercises_error_icon); 146 break; 147 case 2: 148 iv_b.setImageResource(R.drawable.exercises_right_icon); 149 break; 150 case 3: 151 iv_c.setImageResource(R.drawable.exercises_right_icon); 152 iv_b.setImageResource(R.drawable.exercises_error_icon); 153 break; 154 case 4: 155 iv_d.setImageResource(R.drawable.exercises_right_icon); 156 iv_b.setImageResource(R.drawable.exercises_error_icon); 157 break; 158 } 159 AnalysisUtils.setABCDEnable(false,iv_a,iv_b,iv_c,iv_d); 160 } 161 @Override 162 public void onSelectA(int postion, ImageView iv_a, ImageView iv_b, ImageView iv_c, ImageView iv_d){ 163 //判断如果答案不是1即A答案 164 if (ebl.get(postion).answer != 1){ 165 ebl.get(postion).select=1; 166 }else { 167 ebl.get(postion).select = 0; 168 } 169 switch (ebl.get(postion).answer){ 170 case 1: 171 iv_a.setImageResource(R.drawable.exercises_right_icon); 172 break; 173 case 2: 174 iv_b.setImageResource(R.drawable.exercises_right_icon); 175 iv_a.setImageResource(R.drawable.exercises_error_icon); 176 break; 177 case 3: 178 iv_c.setImageResource(R.drawable.exercises_right_icon); 179 iv_a.setImageResource(R.drawable.exercises_error_icon); 180 break; 181 case 4: 182 iv_d.setImageResource(R.drawable.exercises_right_icon); 183 iv_a.setImageResource(R.drawable.exercises_error_icon); 184 break; 185 } 186 AnalysisUtils.setABCDEnable(false,iv_a,iv_b,iv_c,iv_d); 187 } 188 189 }); 190 adapter.setData(ebl); 191 lv_list.setAdapter(adapter); 192 } 193 194}
6、修改界面代码
(1)、修改习题界面数据适配器
找到ExercisesAdapter.java文件,在注释//跳转到习题详情界面下方添加如下代码:
1Intent intent = new Intent(mContext, ExercisesDetailActivity.class); 2ntent.putExtra("id",bean.id); 3intent.putExtra("title",bean.title); 4mContext.startActivity(intent);
(2)、设置A,B,C,D四个选项是否可以点击
找到AnalysisUtils.java文件,添加如下代码:
1//设置A,B,C,D4个选项是否可以被点击 2public static void setABCDEnable(boolean value, ImageView iv_a,ImageView iv_b, ImageView iv_c,ImageView iv_d){ 3iv_a.setEnabled(value); 4iv_b.setEnabled(value); 5iv_c.setEnabled(value); 6iv_d.setEnabled(value); 7 }
三,运行效果


