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
相关产品推荐
相关产品推荐

