用于展现重复性的东西,Listview比较好用,看了别人的自定义Adapter(item是EditText,能够很好地获取到每一个item的EditText值)。又由于在做项目的需要,故特制了一个item包含RadioGroup的Listview的自定义Adapter。

主要功能:

1.将任意数目的单选题(题干和4个选项)展现在界面上;

2.每一题都选择后,提交,可以讲每一题的答案获取到

涉及到两个entity:

public class TopicItem implements Serializable {

private String questionId;//题目id

private String question;//题干

private String answerId;

private String userAnswerId; //选择的答案选项

private List optionList;

public String getQuestionId() {

return questionId;

}

public void setQuestionId(String questionId) {

this.questionId = questionId;

}

public String getQuestion() {

return question;

}

public void setQuestion(String question) {

this.question = question;

}

public String getAnswerId() {

return answerId;

}

public void setAnswerId(String answerId) {

this.answerId = answerId;

}

public String getUserAnswerId() {

return userAnswerId;

}

public void setUserAnswerId(String userAnswerId) {

this.userAnswerId = userAnswerId;

}

public List getOptionList() {

return optionList;

}

public void setOptionList(List optionList) {

this.optionList = optionList;

}

}

public class OptionItem implements Serializable {

private String answerOption;//选项序号

private String answer;//选项文字

public String getAnswerOption() {

return answerOption;

}

public void setAnswerOption(String answerOption) {

this.answerOption = answerOption;

}

public String getAnswer() {

return answer;

}

public void setAnswer(String anwer) {

this.answer = anwer;

}

}

自定义的adapter:

public class TopicAdapter extends BaseAdapter {

private static final String TAG = "TopicAdapter" ;

String KEY = "list_topic_item";

private LayoutInflater mInflater;

private Context context;

private List> mData;

public TopicAdapter(Context context, List> data) {

mData = data;

mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

this.context = context;

init();

}

private void init() {

mData.clear();

}

@Override

public int getCount() {

int count = mData == null ? 0 : mData.size();

return count ;

}

@Override

public Object getItem(int position) {

/*Object obj = records != null && records.size() > position ? records.get(position) : null;

return obj;*/

return null;

}

@Override

public long getItemId(int position) {

//return position;

return 0;

}

private Integer index = -1;

@Override

public View getView(final int position, View convertView, ViewGroup parent) {

Holder holder = null;

if( convertView == null ){

convertView = mInflater.inflate(R.layout.topic_item, null);

holder = new Holder() ;

holder.question = (TextView)convertView.findViewById(R.id.topic_item_question);

holder.option = (RadioGroup) convertView.findViewById(R.id.topic_item_option);

holder.option1 = (RadioButton) convertView.findViewById(R.id.topic_item_option1);

holder.option2 = (RadioButton) convertView.findViewById(R.id.topic_item_option2);

holder.option3 = (RadioButton) convertView.findViewById(R.id.topic_item_option3);

holder.option4 = (RadioButton) convertView.findViewById(R.id.topic_item_option4);

holder.option.setTag(position);

holder.option.setOnTouchListener(new OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_UP) {

index = (Integer) v.getTag();

}

return false;

}

});

class MyOnCheckedChangeListener implements RadioGroup.OnCheckedChangeListener {

public MyOnCheckedChangeListener(Holder holder) {

mHolder = holder;

}

private Holder mHolder;

@Override

public void onCheckedChanged(RadioGroup group, int checkedId) {

// TODO Auto-generated method stub

int position = (Integer) mHolder.option.getTag();

TopicItem item = mData.get(position).get(KEY);

int RadioButtonId = mHolder.option.getCheckedRadioButtonId();

group.check(RadioButtonId);

RadioButton rb = (RadioButton)mHolder.option.findViewById(RadioButtonId);

if(RadioButtonId==mHolder.option1.getId()){

item.setUserAnswerId(item.getOptionList().get(0).getAnswerOption().trim());

}else if(RadioButtonId==mHolder.option2.getId()){

item.setUserAnswerId(item.getOptionList().get(1).getAnswerOption().trim());

}else if(RadioButtonId==mHolder.option3.getId()){

item.setUserAnswerId(item.getOptionList().get(2).getAnswerOption().trim());

}else if(RadioButtonId==mHolder.option4.getId()){

item.setUserAnswerId(item.getOptionList().get(3).getAnswerOption().trim());

}

mData.get(position).put(KEY, item);

}

}

holder.option.setOnCheckedChangeListener(new MyOnCheckedChangeListener(holder));

convertView.setTag(holder);

}else{

holder = (Holder)convertView.getTag();

holder.option.setTag(position);

}

TopicItem item = (TopicItem)mData.get(position).get(KEY);

if( item != null ){

holder.question.setText(item.getQuestion());

holder.option1.setText(item.getOptionList().get(0).getAnswer().toString());

holder.option2.setText(item.getOptionList().get(1).getAnswer().toString());

holder.option3.setText(item.getOptionList().get(2).getAnswer().toString());

holder.option4.setText(item.getOptionList().get(3).getAnswer().toString());

if(item.getUserAnswerId().trim().equalsIgnoreCase(item.getOptionList().get(0).getAnswerOption().trim())){

holder.option.check(holder.option1.getId());

}

else if(item.getUserAnswerId().trim().equalsIgnoreCase(item.getOptionList().get(1).getAnswerOption().trim())){

holder.option.check(holder.option2.getId());

}else if(item.getUserAnswerId().trim().equalsIgnoreCase(item.getOptionList().get(2).getAnswerOption().trim())){

holder.option.check(holder.option3.getId());

}else if(item.getUserAnswerId().trim().equalsIgnoreCase(item.getOptionList().get(3).getAnswerOption().trim())){

holder.option.check(holder.option4.getId());

}

}

holder.option.clearFocus();

if (index != -1 && index == position) {

holder.option.requestFocus();

}

return convertView;

}

private class Holder{

private TextView question;

private RadioGroup option;

private RadioButton option1;

private RadioButton option2;

private RadioButton option3;

private RadioButton option4;

}

}

应用步骤:

1.定义一些变量,为后面做准备

//Adapter需要该Activity的context

public Context context;

private ListView topic_listview;

private Button button_sent;

private BaseAdapter mAdapter;

//需要将题目数据存在Map中,多个Map组成list,并传给Adapter

//一道题对应一个Map

private List> data = new ArrayList>();

//模拟http获取到的Json类型的数据

JSONObject data_json;

//Map存入数据时的key

String KEY = "list_topic_item";

2.初始化题目数据,这里直接本地编了几道题,可以从服务器上获取

private void initData(){

try {

data_json = new JSONObject();

data_json.put("result", "success");

JSONArray array = new JSONArray();

for(int i=0;i<3;i++){

JSONObject object = new JSONObject();

object.put("questionId", "1");

object.put("question", "康熙是乾隆的谁?");

object.put("answerId", "");

//一开始选择好第三项

object.put("userAnswerId", "3");

JSONArray sarray = new JSONArray();

JSONObject sobject1 = new JSONObject();

sobject1.put("answerOption", "1");

sobject1.put("answer", "儿子");

sarray.put(sobject1);

JSONObject sobject2 = new JSONObject();

sobject2.put("answerOption", "2");

sobject2.put("answer", "爷爷");

sarray.put(sobject2);

JSONObject sobject3 = new JSONObject();

sobject3.put("answerOption", "3");

sobject3.put("answer", "父亲");

sarray.put(sobject3);

JSONObject sobject4 = new JSONObject();

sobject4.put("answerOption", "4");

sobject4.put("answer", "孙子");

sarray.put(sobject4);

object.put("optionList", sarray);

array.put(object);

}

data_json.put("list", array);

} catch (JSONException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

3.将Listview与自定义的TopicAdapter关联起来

this.context = this;

//获取Listview

topic_listview = (ListView)findViewById(R.id.topic_quest_answer);

//data是题目的数据,放在Map里

mAdapter = new TopicAdapter(context, data);

topic_listview.setAdapter(mAdapter);

4.将Json中的题目数据解析并放入data,更新给Adapter,这样关联的Listview此时才将数据显示出来

private void getData(){

System.out.println(data_json.toString());

data.clear();

if(data_json.optString("result").equals("success")){

if(data_json.optJSONArray("list")!=null){

for(int i=0;i

JSONObject object = data_json.optJSONArray("list").optJSONObject(i);

TopicItem topic = new TopicItem();

topic.setAnswerId(object.optString("answerId"));

topic.setQuestionId(object.optString("questionId"));

topic.setQuestion(object.optString("question"));

topic.setUserAnswerId(object.optString("userAnswerId"));

List optionList = new ArrayList();

for(int j=0;j

JSONObject object_option = object.optJSONArray("optionList").optJSONObject(j);

OptionItem option = new OptionItem();

option.setAnswerOption(object_option.optString("answerOption"));

option.setAnswer(object_option.optString("answer"));

optionList.add(option);

}

topic.setOptionList(optionList);

Map list_item = new HashMap();

list_item.put(KEY, topic);

data.add(list_item);

}

//提醒Adapter更新数据,紧接着Listview显示新的数据

mAdapter.notifyDataSetChanged();

}

}

}

5.用户答题,提交题目的答案时,我们可以看到所有的题目及选择的选项:

button_sent = (Button) findViewById(R.id.topic_sent_comment);

button_sent.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View v) {

// TODO Auto-generated method stub

String t="";

for (int i = 0; i < data.size(); i++) {

t = t+"第 "+(i+1)+" 题 ----------->您选择了【选项"

+data.get(i).get(KEY).getUserAnswerId().trim()+"】 \n";

}

Toast.makeText(context, t, Toast.LENGTH_SHORT).show();

}

});

接下来,我们来看具体运行情况:

a.

每一题我设选项都是第三项,object.put(“userAnswerId”, “3”);

b.

接下来人工选择,分别为4,3,2项

c.提交,可以看到提取结果正确

这里想提供一个demo,不知道怎么上传。

demo地址

以前不知道怎么传,现在补上

android笔试添加自定义服务,Android之Listview(item为单选题)自定义adapter,像考试时前面的10几道单选题的实现...相关推荐

  1. Android Framework添加自定义服务和接口

    1.扩展Framework接口 1.1.定义Java接口 在 frameworks/base/core/java目录下,根据包名创建一个子目录,比如我创建的是com/wrtsz/api/,在该目录下, ...

  2. 【Android 】零基础到飞升 | ListView Item多布局的实现

    2.5.1 ListView Item多布局的实现 本节引言: 本节是ListView这个小节的最后一节,给大家带来的是ListView多布局Item的实现, 何为ListView Item多布局,打 ...

  3. android无法实例化服务,Android:无法实例化类:没有空的构造函数

    请看下面,我得到一个无法实例化类:当试图运行我的"HomeFragmentListExpand"类时,LogCat中没有空的构造函数错误,即使我清楚地有一个空的构造函数那里.And ...

  4. Android 进程 缓存服务,Android获取应用程序大小和缓存的实例代码

    info package com.qin.appsize; import android.content.Intent; import android.graphics.drawable.Drawab ...

  5. android四大组件 服务,Android四大组件之Service

    Service Service(服务)是一个可以在后台执行长时间运行操作而不使用用户界面的应用组件.服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行. 此外,组件可以绑定到 ...

  6. android开机优化服务,Android开机速度优化简单回顾

    Android的开机速度,基本上没人说快的,通常移植完系统后,马上要看的事情就是优化开机时间,以下是简单回忆以下以前做优化的那些事. 开机时间都花在哪? 优化开机时间,通常做的首先是那有有没有BUG, ...

  7. android打开位置服务,Android - 位置定位(Location)服务(Service)类的基本操作

    位置定位(Location)服务(Service)类的基本操作 本文地址: http://blog.csdn.net/caroline_wendy 定位服务(Location Service),能够确 ...

  8. android中暂停服务,Android暂停服务,线程,Asynctask?使用postdelayed的处理程序呢?...

    我有后台服务(Service→Thread→Timer→Asynctask). Timer每5秒执行一次Asynctask.如果Asynctask返回true,则发送通知.Android暂停服务,线程 ...

  9. android 基于位置服务,Android 基于位置服务的基本知识

    1.在android平台使用位置服务需要使用位置管理器,获得方法如下: String locationService =Context.LOCATION_SERVICE; LocationManage ...

最新文章

  1. 在用交叉熵损失函数时,只希望惩罚0.4-0.6这样模糊的值,应该怎么改?
  2. 最优二叉树——哈夫曼树
  3. 选择结构_标准if-else语句
  4. NAT模式下虚拟机与主机网络关系配置
  5. opengl GPU 纹理加速优化
  6. ECS之Component组件
  7. SAS接口互连完全指南
  8. [bug解决] TensorFlow安装错误:ERROR Cannot uninstall ‘wrapt‘
  9. git 本地 更新到 仓库 仅仅 操作系统课程设计
  10. 【宏】解决vcard乱码批量导入outlook
  11. 『概率知识』伯努利试验及n重伯努利试验+方差协方差理解!
  12. dubbo源码分析-dubbo-serialization
  13. 蓝本蓝科技:社群变现的模式有哪些?
  14. [无人机学习]无人机学习概论
  15. 程序员外包工作3年,跳槽却没人要,网友:你也太老实了吧
  16. .计算机软件系统包括,计算机软件系统包括什么
  17. Houdini 导出.ass文件
  18. Nat学习(sNat和dNat)
  19. 学做网站用什么服务器,做网站需要学习什么
  20. ETF动量轮动+RSRS择时,RSRS修正标准分,回撤降至16%

热门文章

  1. 年仅26岁!这位双一流大学的特任教授,攻克世界数学难题
  2. “两小学生研究喝茶抗癌获奖”,官方回应:经老师培训独立完成
  3. MNTD论文修改20211114(Y Zhou)
  4. Hbase WALs(HLog) 文件存储,查看
  5. Kafka(六)Kafka基本客户端命令操作
  6. 【数据湖加速篇】 —— 数据湖结构化数据优化与查询加速方案
  7. 10+知识图谱开放下载,让你的学习效率提升5倍! | “右脑”开发套餐
  8. 都在说实时数据架构,你了解多少?
  9. 自然语言生成(NLG)的好处是什么,它如何影响BI?
  10. 阿里云产品头条(2017年12月刊)