如何将RecyclerView Adapter中选中的联系人对象传递至另一Activity?
解决RecyclerView Adapter向另一个Activity传递选中联系人对象的问题
你已经搞定了带复选框的联系人列表展示,也能把选中的联系人添加到对象里,现在就差把这些选中的数据从Adapter传到另一个Activity对吧?我给你分享几种常用且靠谱的实现方式:
方法一:接口回调(推荐,低耦合)
这是Android开发中组件间通信的常规操作,通过定义接口让Adapter把选中数据回调给宿主Activity,再由Activity传递给下一个页面。
首先在你的Adapter里定义回调接口,并在选中状态变化时触发回调:
public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ViewHolder> { private List<PlayerDetails> playerData; private List<PlayerDetails> selectedPlayers = new ArrayList<>(); private OnSelectedPlayersListener listener; // 定义回调接口 public interface OnSelectedPlayersListener { void onSelectedPlayersUpdated(List<PlayerDetails> selectedPlayers); } // 构造方法传入回调监听 public ContactsAdapter(List<PlayerDetails> playerData, OnSelectedPlayersListener listener) { this.playerData = playerData; this.listener = listener; } @Override public void onBindViewHolder(ViewHolder holder, final int position) { final PlayerDetails thePlayer = playerData.get(position); // 这里写绑定联系人名称、号码的代码... holder.checkbox.setOnCheckedChangeListener((buttonView, isChecked) -> { if (isChecked) { selectedPlayers.add(thePlayer); } else { selectedPlayers.remove(thePlayer); } // 每次选中状态变化,把最新选中列表回调给Activity if (listener != null) { listener.onSelectedPlayersUpdated(selectedPlayers); } }); } // 你的ViewHolder类... }
然后在宿主Activity中实现这个接口,拿到选中数据后,通过Intent传递给下一个Activity:
public class ContactsActivity extends AppCompatActivity implements ContactsAdapter.OnSelectedPlayersListener { private List<PlayerDetails> selectedPlayers; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contacts); RecyclerView recyclerView = findViewById(R.id.recycler_view); List<PlayerDetails> playerData = // 初始化你的联系人数据源 ContactsAdapter adapter = new ContactsAdapter(playerData, this); recyclerView.setAdapter(adapter); // 设置LayoutManager等其他配置... } @Override public void onSelectedPlayersUpdated(List<PlayerDetails> selectedPlayers) { this.selectedPlayers = selectedPlayers; } // 比如点击"跳转"按钮时触发 public void navigateToNextActivity(View view) { Intent intent = new Intent(this, TargetActivity.class); // 重点:PlayerDetails必须实现Serializable或Parcelable接口才能通过Intent传递 intent.putParcelableArrayListExtra("SELECTED_CONTACTS", new ArrayList<>(selectedPlayers)); startActivity(intent); } }
方法二:ViewModel共享数据(适合复杂页面场景)
如果你的项目用了Jetpack组件,用ViewModel来跨页面共享数据会更优雅,尤其是页面间需要实时同步选中状态的情况。
先创建一个共享ViewModel:
public class SharedContactViewModel extends ViewModel { private MutableLiveData<List<PlayerDetails>> selectedContacts = new MutableLiveData<>(); public void updateSelectedContacts(List<PlayerDetails> contacts) { selectedContacts.setValue(contacts); } public LiveData<List<PlayerDetails>> getSelectedContacts() { return selectedContacts; } }
在宿主Activity中初始化ViewModel并传给Adapter:
public class ContactsActivity extends AppCompatActivity { private SharedContactViewModel viewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_contacts); viewModel = new ViewModelProvider(this).get(SharedContactViewModel.class); RecyclerView recyclerView = findViewById(R.id.recycler_view); List<PlayerDetails> playerData = // 初始化数据源 ContactsAdapter adapter = new ContactsAdapter(playerData, viewModel); recyclerView.setAdapter(adapter); } public void navigateToNextActivity(View view) { startActivity(new Intent(this, TargetActivity.class)); } }
Adapter中更新ViewModel的选中数据:
public class ContactsAdapter extends RecyclerView.Adapter<ContactsAdapter.ViewHolder> { private List<PlayerDetails> playerData; private List<PlayerDetails> selectedPlayers = new ArrayList<>(); private SharedContactViewModel viewModel; public ContactsAdapter(List<PlayerDetails> playerData, SharedContactViewModel viewModel) { this.playerData = playerData; this.viewModel = viewModel; } @Override public void onBindViewHolder(ViewHolder holder, final int position) { final PlayerDetails thePlayer = playerData.get(position); // 绑定联系人信息... holder.checkbox.setOnCheckedChangeListener((buttonView, isChecked) -> { if (isChecked) { selectedPlayers.add(thePlayer); } else { selectedPlayers.remove(thePlayer); } viewModel.updateSelectedContacts(selectedPlayers); }); } // ViewHolder类... }
最后在目标Activity中获取数据:
public class TargetActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_target); SharedContactViewModel viewModel = new ViewModelProvider(this).get(SharedContactViewModel.class); viewModel.getSelectedContacts().observe(this, selectedContacts -> { // 在这里处理选中的联系人列表 }); } }
关键注意事项
不管用哪种方法,PlayerDetails类必须实现Serializable或Parcelable接口,否则无法通过Intent传递对象。推荐用Parcelable,它的序列化效率更高,Android Studio可以通过插件自动生成Parcelable的实现代码,非常方便。
内容的提问来源于stack exchange,提问作者user9607849
相关产品推荐
相关产品推荐

