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

Android:跨Activity传递单选框选中值并设置ListView子项单选组状态

解决单选值传递及ListView子项RadioGroup状态设置问题

我来帮你搞定这个Android开发里的需求,咱们一步步来修正和实现:

第一步:确保第一个Activity能正确传递选中值

首先,假设你的第一个Activity里有一个RadioGroup,用户选择后点击跳转按钮,把选中状态传递到AttendanceActivity。示例代码如下:

// 第一个Activity的核心代码
RadioGroup firstRadioGroup = findViewById(R.id.your_first_radio_group);
Button goToAttendanceBtn = findViewById(R.id.go_to_attendance_btn);

goToAttendanceBtn.setOnClickListener(v -> {
    int selectedRadioId = firstRadioGroup.getCheckedRadioButtonId();
    // 定义1代表"出勤",2代表"缺勤",默认设为1
    int aorp = 1;
    if (selectedRadioId == R.id.absent_radio_in_first_activity) {
        aorp = 2;
    }
    // 跳转并传递值
    Intent intent = new Intent(FirstActivity.this, AttendanceActivity.class);
    intent.putExtra("aorb", aorp);
    startActivity(intent);
});

第二步:修正AttendanceActivity的逻辑

你之前的代码犯了一个关键错误:直接inflate一个单独的子项布局设置单选状态,但这个布局并没有被加入到ListView中。正确的做法是把传递过来的选中值传给自定义Adapter,让Adapter去处理每个子项的状态。

修改后的AttendanceActivity.java:

public class AttendanceActivity extends AppCompatActivity {
    ListView attendanceListView;
    String[] penNumber;
    Button saveAttendance;
    int defaultAttendanceStatus; // 存储从第一个Activity传过来的选中值

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_attendance);

        // 获取传递过来的状态值,默认1代表出勤
        Intent intent = getIntent();
        defaultAttendanceStatus = intent.getIntExtra("aorb", 1);

        // 初始化控件和数据
        penNumber = getResources().getStringArray(R.array.penNo);
        attendanceListView = findViewById(R.id.attendanceListView);
        saveAttendance = findViewById(R.id.saveAttendance);

        // 把默认状态传给Adapter
        AttendanceListViewAdapter customAdapter = new AttendanceListViewAdapter(
                getApplicationContext(), penNumber, defaultAttendanceStatus);
        attendanceListView.setAdapter(customAdapter);

        saveAttendance.setOnClickListener(v -> {
            // 这里可以添加保存考勤数据的逻辑
            Intent i = new Intent(AttendanceActivity.this, /* 你的目标Activity */);
            startActivity(i);
        });
    }
}

第三步:修改自定义Adapter,为每个子项设置RadioGroup状态

现在要让Adapter在创建每个ListView子项时,根据传递过来的默认值设置RadioGroup的选中状态,同时用ViewHolder优化性能:

public class AttendanceListViewAdapter extends ArrayAdapter<String> {
    private Context context;
    private String[] penNumbers;
    private int defaultStatus;

    public AttendanceListViewAdapter(Context context, String[] penNumbers, int defaultStatus) {
        super(context, R.layout.attendance_list_item, penNumbers);
        this.context = context;
        this.penNumbers = penNumbers;
        this.defaultStatus = defaultStatus;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        ViewHolder holder;

        // 复用布局,提升性能
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.attendance_list_item, parent, false);
            holder = new ViewHolder();
            holder.attendanceRadioGroup = convertView.findViewById(R.id.AttendanceRadio);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        // 根据默认值设置RadioGroup的选中状态
        if (defaultStatus == 1) {
            holder.attendanceRadioGroup.check(R.id.present_radio);
        } else if (defaultStatus == 2) {
            holder.attendanceRadioGroup.check(R.id.absent_radio);
        }

        // 设置工号显示(假设你的子项布局里有一个id为pen_no_tv的TextView)
        TextView penNoTv = convertView.findViewById(R.id.pen_no_tv);
        penNoTv.setText(penNumbers[position]);

        return convertView;
    }

    // ViewHolder类,避免重复调用findViewById
    static class ViewHolder {
        RadioGroup attendanceRadioGroup;
    }
}

关键要点说明

  • 为什么之前的代码不生效? 你直接inflate的子项布局只是一个独立的View,并没有被关联到ListView的子项中。ListView的所有子项都是由Adapter的getView方法创建和复用的,所以必须在这里处理状态设置。
  • ViewHolder的作用 用它来缓存控件实例,避免每次滚动ListView都重新查找控件,大大提升滚动流畅度。
  • 默认值处理 在获取传递值时设置默认值1,确保即使没有传递值,也能有一个合理的默认选中状态。

内容的提问来源于stack exchange,提问作者Kunal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:55:25