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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:39:35