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

Android会议日程APP:RecyclerView多选及跨Activity数据传递实现

实现RecyclerView多选并传递选中数据到另一个Activity

步骤1:更新Model类,添加选中状态与序列化支持

给Model类新增选中状态字段,同时实现Parcelable接口(用于通过Intent高效传递对象列表):

package com.example.firebaseapplication;

import android.os.Parcel;
import android.os.Parcelable;

public class Model implements Parcelable {
    private String name;
    private String department;
    private String purl;
    private boolean isSelected; // 标记用户是否被选中

    // Firebase需要的空构造方法
    public Model() {}

    public Model(String name, String department, String purl) {
        this.name = name;
        this.department = department;
        this.purl = purl;
        this.isSelected = false; // 默认未选中
    }

    // Getter和Setter方法
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public String getDepartment() { return department; }
    public void setDepartment(String department) { this.department = department; }

    public String getPurl() { return purl; }
    public void setPurl(String purl) { this.purl = purl; }

    public boolean isSelected() { return isSelected; }
    public void setSelected(boolean selected) { isSelected = selected; }

    // Parcelable接口实现代码
    protected Model(Parcel in) {
        name = in.readString();
        department = in.readString();
        purl = in.readString();
        isSelected = in.readByte() != 0;
    }

    public static final Creator<Model> CREATOR = new Creator<Model>() {
        @Override
        public Model createFromParcel(Parcel in) {
            return new Model(in);
        }

        @Override
        public Model[] newArray(int size) {
            return new Model[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeString(department);
        dest.writeString(purl);
        dest.writeByte((byte) (isSelected ? 1 : 0));
    }
}

步骤2:修改RecyclerView条目布局,添加复选框

在single_row_layout.xml中新增CheckBox,用于用户选择操作:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/single_row_layout_img1"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/ic_default_user"/>

    <TextView
        android:id="@+id/single_row_layout_t1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/single_row_layout_img1"
        android:layout_marginLeft="16dp"
        android:textSize="18sp"
        android:textStyle="bold"/>

    <TextView
        android:id="@+id/single_row_layout_t2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/single_row_layout_t1"
        android:layout_toRightOf="@id/single_row_layout_img1"
        android:layout_marginLeft="16dp"
        android:textSize="14sp"/>

    <CheckBox
        android:id="@+id/checkBox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"/>

</RelativeLayout>

步骤3:更新ViewHolder,绑定复选框

修改myViewHolder类,新增对复选框的引用:

package com.example.firebaseapplication;

import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import de.hdodenhof.circleimageview.CircleImageView;

public class myViewHolder extends RecyclerView.ViewHolder {
    CircleImageView img;
    TextView textViewName, textViewDepartment;
    CheckBox checkBox; // 新增复选框引用

    public myViewHolder(@NonNull View itemView) {
        super(itemView);
        img = itemView.findViewById(R.id.single_row_layout_img1);
        textViewName = itemView.findViewById(R.id.single_row_layout_t1);
        textViewDepartment = itemView.findViewById(R.id.single_row_layout_t2);
        checkBox = itemView.findViewById(R.id.checkBox); // 绑定复选框
    }
}

步骤4:修改Adapter,实现多选逻辑

更新myAdapter,维护选中用户列表,处理选中状态切换:

package com.example.firebaseapplication;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;

import com.bumptech.glide.Glide;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;

import java.util.ArrayList;
import java.util.List;

public class myAdapter extends FirebaseRecyclerAdapter<Model, myViewHolder> {
    private final List<Model> selectedUsers = new ArrayList<>(); // 存储选中的用户

    public myAdapter(FirebaseRecyclerOptions<Model> options) {
        super(options);
    }

    @NonNull
    @Override
    public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(R.layout.single_row_layout, parent, false);
        return new myViewHolder(view);
    }

    @Override
    protected void onBindViewHolder(@NonNull myViewHolder holder, int position, @NonNull Model model) {
        holder.textViewName.setText(model.getName());
        holder.textViewDepartment.setText(model.getDepartment());
        Glide.with(holder.img.getContext()).load(model.getPurl()).into(holder.img);

        // 设置复选框初始状态
        holder.checkBox.setChecked(model.isSelected());

        // 复选框点击事件
        holder.checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> {
            model.setSelected(isChecked);
            updateSelectedList(model, isChecked);
        });

        // 整行点击切换选中状态(可选)
        holder.itemView.setOnClickListener(v -> {
            boolean newState = !model.isSelected();
            model.setSelected(newState);
            holder.checkBox.setChecked(newState);
            updateSelectedList(model, newState);
        });
    }

    // 更新选中用户列表
    private void updateSelectedList(Model model, boolean isChecked) {
        if (isChecked) {
            if (!selectedUsers.contains(model)) {
                selectedUsers.add(model);
            }
        } else {
            selectedUsers.remove(model);
        }
    }

    // 对外提供获取选中用户的方法
    public List<Model> getSelectedUsers() {
        return selectedUsers;
    }
}

步骤5:修改ListOfUsersActivity,添加确认按钮并传递数据

首先创建菜单文件menu/list_users_menu.xml:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_confirm"
        android:title="确认选择"
        app:showAsAction="always"/>
</menu>

然后修改ListOfUserActivity.java,处理菜单点击并传递数据:

package com.example.firebaseapplication;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.FirebaseDatabase;

import java.util.List;

public class ListOfUserActivity extends AppCompatActivity {
    private RecyclerView rcv;
    myAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_of_user);
        setTitle("所有注册用户");

        rcv = findViewById(R.id.rclView);
        rcv.setLayoutManager(new LinearLayoutManager(this));

        FirebaseRecyclerOptions<Model> options =
                new FirebaseRecyclerOptions.Builder<Model>()
                        .setQuery(FirebaseDatabase.getInstance().getReference().child("Registered Users"), Model.class)
                        .build();

        adapter = new myAdapter(options);
        rcv.setAdapter(adapter);
    }

    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }

    // 加载菜单
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.list_users_menu, menu);
        return true;
    }

    // 处理确认按钮点击
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.action_confirm) {
            List<Model> selectedUsers = adapter.getSelectedUsers();
            if (!selectedUsers.isEmpty()) {
                Intent intent = new Intent(this, ScheduleActivity.class);
                intent.putParcelableArrayListExtra("SELECTED_USERS", new ArrayList<>(selectedUsers));
                startActivity(intent);
                finish();
            }
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

步骤6:在ScheduleActivity中接收并展示选中用户

假设ScheduleActivity有一个RecyclerView用于展示参会人,实现对应的Adapter并接收数据:

package com.example.firebaseapplication;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.bumptech.glide.Glide;

import java.util.ArrayList;
import java.util.List;

import de.hdodenhof.circleimageview.CircleImageView;

public class ScheduleActivity extends AppCompatActivity {
    private RecyclerView attendeeRcv;
    AttendeeAdapter attendeeAdapter;

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

        attendeeRcv = findViewById(R.id.attendee_recycler_view);
        attendeeRcv.setLayoutManager(new LinearLayoutManager(this));

        // 获取传递的选中用户列表
        ArrayList<Model> selectedUsers = getIntent().getParcelableArrayListExtra("SELECTED_USERS");
        if (selectedUsers != null && !selectedUsers.isEmpty()) {
            attendeeAdapter = new AttendeeAdapter(selectedUsers);
            attendeeRcv.setAdapter(attendeeAdapter);
        }
    }

    // 参会人展示Adapter
    private static class AttendeeAdapter extends RecyclerView.Adapter<AttendeeViewHolder> {
        private final List<Model> attendeeList;

        public AttendeeAdapter(List<Model> attendeeList) {
            this.attendeeList = attendeeList;
        }

        @NonNull
        @Override
        public AttendeeViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.attendee_row_layout, parent, false);
            return new AttendeeViewHolder(view);
        }

        @Override
        public void onBindViewHolder(@NonNull AttendeeViewHolder holder, int position) {
            Model model = attendeeList.get(position);
            holder.nameTv.setText(model.getName());
            holder.departmentTv.setText(model.getDepartment());
            Glide.with(holder.img.getContext()).load(model.getPurl()).into(holder.img);
        }

        @Override
        public int getItemCount() {
            return attendeeList.size();
        }
    }

    private static class AttendeeViewHolder extends RecyclerView.ViewHolder {
        CircleImageView img;
        TextView nameTv, departmentTv;

        public AttendeeViewHolder(@NonNull View itemView) {
            super(itemView);
            img = itemView.findViewById(R.id.attendee_img);
            nameTv = itemView.findViewById(R.id.attendee_name);
            departmentTv = itemView.findViewById(R.id.attendee_department);
        }
    }
}

对应的attendee_row_layout.xml可参考single_row_layout.xml调整样式,满足参会人展示需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:47:04