You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:13:12