Android/Java实现ListView行按答题结果(对错)着色需求求助
解决ListView答题后对应行着色的方案
嘿,这个需求其实挺常见的,我来给你一步步拆解实现方法,保证能搞定这个问题~
核心思路
要实现这个功能,关键要解决三个点:
- 答题完成后把结果传回原Activity
- 存储每个问题的答题状态(正确/错误)
- 自定义Adapter,根据状态给ListView行设置颜色
步骤1:修改跳转方式,接收答题结果
你现在用的startActivity()没法接收返回结果,得换成能获取返回值的方式:
方式一:用废弃但仍可用的startActivityForResult(适合旧项目)
首先在原Activity定义一个请求码常量:
private static final int REQUEST_CODE_ANSWER = 1;
然后把跳转代码里的startActivity(inte);改成:
startActivityForResult(inte, REQUEST_CODE_ANSWER);
方式二:用AndroidX推荐的registerForActivityResult(推荐)
在原Activity的onCreate()里初始化一个结果启动器:
ActivityResultLauncher<Intent> answerLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { // 接收返回的结果 boolean isCorrect = result.getData().getBooleanExtra("isCorrect", false); int position = result.getData().getIntExtra("position", -1); // 更新状态并刷新列表 if (position != -1) { answerStatusMap.put(position, isCorrect); lstad.notifyDataSetChanged(); } } });
跳转时用这个启动器替代startActivity():
answerLauncher.launch(inte);
步骤2:在答题页面(ReponseActivity)返回结果
当用户选择正确/错误后,把结果和原问题的位置传回原Activity:
比如给正确按钮添加点击事件:
findViewById(R.id.btn_correct).setOnClickListener(v -> { Intent resultIntent = new Intent(); // 传答题结果:true=正确,false=错误 resultIntent.putExtra("isCorrect", true); // 传回原问题在ListView的位置 resultIntent.putExtra("position", getIntent().getIntExtra("position", -1)); setResult(RESULT_OK, resultIntent); finish(); });
错误按钮同理,只需把isCorrect设为false即可。
步骤3:存储答题状态,自定义Adapter实现着色
默认的ArrayAdapter没法根据状态动态改变行颜色,我们需要自定义一个Adapter,同时用集合存储每个问题的答题状态:
3.1 定义全局状态集合
在原Activity里定义一个HashMap来存储每个位置的答题结果:
private HashMap<Integer, Boolean> answerStatusMap = new HashMap<>();
3.2 自定义QuestionAdapter
创建一个继承自ArrayAdapter的自定义Adapter:
public class QuestionAdapter extends ArrayAdapter<String> { private HashMap<Integer, Boolean> answerStatus; public QuestionAdapter(Context context, int resource, List<String> objects, HashMap<Integer, Boolean> answerStatus) { super(context, resource, objects); this.answerStatus = answerStatus; } @Override public View getView(int position, View convertView, ViewGroup parent) { View itemView = super.getView(position, convertView, parent); // 根据状态设置行颜色 Boolean isCorrect = answerStatus.get(position); if (isCorrect != null) { itemView.setBackgroundColor(isCorrect ? Color.GREEN : Color.RED); } else { // 未答题时用默认背景色 itemView.setBackgroundColor(Color.WHITE); } return itemView; } }
3.3 替换原Adapter为自定义Adapter
在showQuest()方法里,把原来的ArrayAdapter换成我们自定义的:
ArrayList<String> lstQ = md.getOnlyQuestions(para); // 传入状态集合初始化Adapter QuestionAdapter lstad = new QuestionAdapter(this, android.R.layout.simple_list_item_1, lstQ, answerStatusMap); lst.setAdapter(lstad);
步骤4:处理返回结果(仅针对startActivityForResult方式)
如果用的是旧的startActivityForResult,需要在原Activity重写onActivityResult()方法:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_ANSWER && resultCode == RESULT_OK && data != null) { boolean isCorrect = data.getBooleanExtra("isCorrect", false); int position = data.getIntExtra("position", -1); if (position != -1) { answerStatusMap.put(position, isCorrect); // 刷新列表 lstad.notifyDataSetChanged(); } } }
注意事项
- 如果重新加载问题列表(比如再次调用
showQuest()),记得清空answerStatusMap,避免旧状态影响新列表:answerStatusMap.clear(); - 如果你想给文字着色而非背景,只需把
setBackgroundColor()换成setTextColor()即可 - 确保ListView的item布局没有固定背景色,否则会覆盖我们设置的颜色
内容的提问来源于stack exchange,提问作者Master49
相关产品推荐
相关产品推荐

