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

用于展现重复性的东西,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.

f9fe911814d663236e0edb979e1b5a39.png

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

b.

d5a4961de38e4e9426436333b1ac84c6.png

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

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

deb836ba29326d74a0d0ef6666af9bb5.png

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

demo地址

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514451.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现工具自由!开源的桌面工具箱

来源: HelloGitHubRubick,因为开源所有更自由在一切开始之前&#xff0c;首先要致敬 uTools&#xff01;如果没有它就没有 Rubick。大家好&#xff0c;我是“拉比克”&#xff08;Rubick&#xff09;项目的作者木偶。我做的 Rubick 是一款基于 Electron 的开源桌面工具箱&#…

测试一年多,上线就崩溃!微服务到底应该怎么测试?

简介&#xff1a; 只有了解风险&#xff0c;才能及时应对&#xff0c;保障服务高可用。 不久前&#xff0c;也就是11月16日&#xff0c;澳大利亚交易所&#xff08;Australian Securities Exchange, ASX&#xff09;上线了一个新的交易系统&#xff0c;但因为出现故障而被迫关闭…

阿里云熊鹰:基于融合、协同系统的边缘云原生架构演进和实践

简介&#xff1a; 云原生和边缘计算是近两年都非常火的技术话题了&#xff0c;在第十届云计算标准和应用大会上&#xff0c;阿里云高级技术专家熊鹰分享了《基于融合、协同系统的边缘云原生架构演进和实践》&#xff0c;希望通过介绍现在阿里云在边缘计算和边缘云原生这些技术领…

漫画:什么是 “建造者模式” ?

作者&#xff1a;东风玖哥来源&#xff1a; 程序员小灰————— 第二天 —————————————————首先&#xff0c;我们来定义一个Product类&#xff1a;public class Product {ArrayList<String> parts new ArrayList<String>();public void add(S…

阿里云云效何勉:云原生是“精益实践”的最佳助力

简介&#xff1a; 1月15日&#xff0c;国内知名“精益产品开发”研究和实践者、阿里云云效资深技术专家何勉在阿里云《云计算情报局》线上直播栏目中&#xff0c;分享其对研发新模式的最新思考&#xff0c;提出“下一代精益开发方法”&#xff0c;助力企业在研发效能上提升10倍…

开发效率提升15倍!批流融合实时平台在好未来的应用实践

简介&#xff1a; 本文由好未来资深数据平台工程师毛祥溢分享&#xff0c;主要介绍批流融合在教育行业的实践。内容包括两部分&#xff0c;第一部分是好未来在做实时平台中的几点思考&#xff0c;第二部分主要分享教育行业中特有数据分析场景。 1.背景介绍 好未来介绍 好未来是…

那些公司都配不上我,所以我选择创业

【CSDN 编者按】她&#xff0c;一个89年的农村姑娘&#xff0c;从种蘑菇到卖煤球&#xff0c;再到敲代码做云原生&#xff0c;成为企业创始人&#xff0c;一路走来她都经历了哪些困难与挑战&#xff0c;对于新生代程序员又有哪些建议&#xff1f;让我们一起来看看她是怎么说的。…

如何跑通第一个 SQL 作业

简介&#xff1a; 本文由阿里巴巴技术专家周凯波&#xff08;宝牛&#xff09;分享&#xff0c;主要介绍如何跑通第一个SQL。 一、SQL的基本概念 1.SQL 分类 SQL分为四类&#xff0c;分别是数据查询语言&#xff08;DQL&#xff09;、数据操纵语言&#xff08;DML&#xff09…

云原生DevOps的5步升级路径

简介&#xff1a; 究竟什么是云原生DevOps呢&#xff1f;我们认为&#xff1a;云原生DevOps是充分利用云原生基础设施&#xff0c;基于微服务/无服务架构体系和开源标准&#xff0c;语言和框架无关&#xff0c;具备持续交付和智能自运维能力&#xff0c;从而做到比传统DevOps更…

数据创新的四个陷阱

简介&#xff1a; 数据的重要性在当今已经无需在多言&#xff0c;所有的企业都意识到数据的重要性&#xff0c;都希望利用数据来驱动业务的发展。但是&#xff0c;很多企业信息化管理者依然存在对于数据智能&#xff0c;数据驱动的一些误解&#xff0c;这些误解会让企业的数据利…

Parallels 发布 Desktop 17版本,支持 Windows 11 和 macOS Monterey

Parallels Desktop 17 亮点速揽&#xff1a;性能提升&#xff0c;对图像效果加以改进、增强了 Windows 游戏体验&#xff0c;同时是全球首个在搭载 Apple M1 芯片的 Mac 上运行的 macOS Monterey 虚拟机&#xff0c;带来更为无缝的跨平台工作体验。 编辑 | 宋慧 头图 | Paralle…

如何将实时计算 Flink 与自身环境打通

简介&#xff1a; 如何使用实时计算 Flink 搞定数据处理难题&#xff1f;实时计算 Flink 客训练营产品、技术专家齐上阵&#xff0c;从 Flink的发展、 Flink 的技术原理、应用场景及行业案例&#xff0c;到开源Flink功能介绍和实时计算 Flink 优势详解&#xff0c;现场实操&…

一文知晓浪潮云海OS在SPEC Cloud测试中的调优实践!

日前&#xff0c;SPEC&#xff08;Standard Performance Evaluation Corporation&#xff0c;即国际标准性能评测组织&#xff09;公布了最新 Cloud IaaS 2018 Benchmark 测试成绩&#xff0c;在同规模测试场景下浪潮数据核心产品浪潮云海OS再次刷新世界纪录&#xff0c;性能得…

阿里云 EMR Delta Lake 在流利说数据接入中的架构和实践

简介&#xff1a; 为了消灭数据孤岛&#xff0c;企业往往会把各个组织的数据都接入到数据湖以提供统一的查询或分析。本文将介绍流利说当前数据接入的整个过程&#xff0c;期间遇到的挑战&#xff0c;以及delta在数据接入中产生的价值。 背景 流利说目前的离线计算任务中&…

怎么提升写代码的能力

简介&#xff1a; 对于程序员而言&#xff0c;我始终认为代码是展现能力的关键&#xff0c;一个优秀程序员写的代码&#xff0c;和一个普通程序员写的代码是很容易看出差别的&#xff0c;代码作为程序员的硬实力和名片的展示&#xff0c;怎么提升写代码的能力始终是一个关键的话…

发力LPWAN 升哲打磨数智城市物联网通信之“芯”

8月上旬&#xff0c;随着多项物联网芯片与通信领域技术发明专利证书的下发&#xff0c;升哲科技&#xff08;SENSORO&#xff09;已在低功耗广域物联网&#xff08;LPWAN&#xff09;及相关领域拥有近百项独家专利&#xff0c;突破国外专利封锁实现国产、自主、可控。这些专利技…

android studio证件照代码,Android 修图(换证件照背景,污点修复)

背景前段时间的一个周末&#xff0c;一个女生让我帮她换一下他的证件照背景&#xff0c;我又没带电脑。我又不好意思拒接&#xff0c;怎么办呢&#xff1f;应用商店下载一个证件照换背景的APP&#xff0c;瞬间换完&#xff0c;我正准备保存时&#xff0c;跳出来一个支付框&…

闲鱼是怎么让二手属性抽取准确率达到95%+的?

闲鱼是怎么让二手属性抽取准确率达到95%的&#xff1f; 先上效果 图1 - 二手属性抽取算法效果Demo(1) 背景 闲鱼作为一款C2X的app&#xff0c;站在商品发布的角度&#xff0c;闲鱼商品相对于淘宝商品的特点有&#xff1a; 轻发布导致商品信息不足 闲鱼采用图文描述的轻发布模…

代号红狗:那些站在微软云起点的中国创业者

作者&#xff1a;亲爱的数据 来源&#xff1a;亲爱的数据011996年的北京。上高中二年级的左玥&#xff0c;代表崇文区参加市一级"四通杯"青少年计算机程序设计竞赛&#xff0c;得了一等奖。据左玥回忆&#xff0c;在去参赛的路上&#xff0c;辅导老师还在吐槽&#x…

如何迁移 Flink 任务到实时计算

简介&#xff1a; 本文由阿里巴巴技术专家景丽宁&#xff08;砚田&#xff09;分享&#xff0c;主要介绍如何迁移Flink任务到实时计算 Flink 中来。 通常用户在线下主要使用 Flink run&#xff0c;这会造成一些问题&#xff0c;比如&#xff1a;同一个配置因版本而变化&#xf…