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

如何从UploadActivity传递数据到MainActivity的RecyclerView?

解决方案:从UploadActivity向MainActivity传递数据到RecyclerView

核心思路

用Parcelable实体类封装4个EditText的输入数据,通过ActivityResultContracts(替代已过时的startActivityForResult)完成页面间数据回传,最后更新RecyclerView的数据源并刷新列表。


步骤1:创建Parcelable数据实体类

封装4个文本数据,确保能通过Intent传递:

public class ItemData implements Parcelable {
    private String text1;
    private String text2;
    private String text3;
    private String text4;

    // 构造方法
    public ItemData(String text1, String text2, String text3, String text4) {
        this.text1 = text1;
        this.text2 = text2;
        this.text3 = text3;
        this.text4 = text4;
    }

    // Parcelable 核心实现
    protected ItemData(Parcel in) {
        text1 = in.readString();
        text2 = in.readString();
        text3 = in.readString();
        text4 = in.readString();
    }

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

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

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(text1);
        dest.writeString(text2);
        dest.writeString(text3);
        dest.writeString(text4);
    }

    // Getter方法(Adapter绑定数据时需要)
    public String getText1() { return text1; }
    public String getText2() { return text2; }
    public String getText3() { return text3; }
    public String getText4() { return text4; }
}

步骤2:UploadActivity处理输入并返回数据

在提交按钮的点击事件中,获取EditText内容,封装到Intent后返回给MainActivity:

// 假设提交按钮ID为btn_submit
findViewById(R.id.btn_submit).setOnClickListener(v -> {
    // 获取4个EditText的输入内容
    String t1 = ((EditText)findViewById(R.id.et_text1)).getText().toString().trim();
    String t2 = ((EditText)findViewById(R.id.et_text2)).getText().toString().trim();
    String t3 = ((EditText)findViewById(R.id.et_text3)).getText().toString().trim();
    String t4 = ((EditText)findViewById(R.id.et_text4)).getText().toString().trim();

    // 封装数据到Intent
    Intent resultIntent = new Intent();
    resultIntent.putExtra("KEY_ITEM_DATA", new ItemData(t1, t2, t3, t4));
    setResult(RESULT_OK, resultIntent);
    finish(); // 关闭UploadActivity
});

步骤3:MainActivity接收数据并更新RecyclerView

通过ActivityResultLauncher注册回调,接收UploadActivity返回的数据,更新数据源后通知Adapter刷新:

public class MainActivity extends AppCompatActivity {
    private List<ItemData> mDataList = new ArrayList<>();
    private MyAdapter mAdapter;
    private ActivityResultLauncher<Intent> mUploadLauncher;

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

        // 初始化RecyclerView
        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        mAdapter = new MyAdapter(mDataList);
        recyclerView.setAdapter(mAdapter);

        // 注册UploadActivity的启动回调
        mUploadLauncher = registerForActivityResult(
                new ActivityResultContracts.StartActivityForResult(),
                result -> {
                    if (result.getResultCode() == RESULT_OK && result.getData() != null) {
                        // 获取返回的ItemData
                        ItemData newItem = result.getData().getParcelableExtra("KEY_ITEM_DATA");
                        if (newItem != null) {
                            // 添加到数据源
                            mDataList.add(newItem);
                            // 通知Adapter插入新项(比notifyDataSetChanged更高效)
                            mAdapter.notifyItemInserted(mDataList.size() - 1);
                        }
                    }
                });

        // 打开UploadActivity的按钮点击事件
        findViewById(R.id.btn_open_upload).setOnClickListener(v -> {
            Intent intent = new Intent(MainActivity.this, UploadActivity.class);
            mUploadLauncher.launch(intent);
        });
    }
}

步骤4:Adapter绑定数据

确保Adapter能正确读取ItemData中的内容并显示到列表项:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<ItemData> mDataList;

    public MyAdapter(List<ItemData> dataList) {
        mDataList = dataList;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        ItemData item = mDataList.get(position);
        holder.tv1.setText(item.getText1());
        holder.tv2.setText(item.getText2());
        holder.tv3.setText(item.getText3());
        holder.tv4.setText(item.getText4());
    }

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

    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView tv1, tv2, tv3, tv4;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tv1 = itemView.findViewById(R.id.tv_text1);
            tv2 = itemView.findViewById(R.id.tv_text2);
            tv3 = itemView.findViewById(R.id.tv_text3);
            tv4 = itemView.findViewById(R.id.tv_text4);
        }
    }
}

关键注意点

  • 必须用Parcelable或Serializable封装数据才能通过Intent传递,推荐Parcelable(性能更优)
  • 回传数据时要设置setResult(RESULT_OK, intent),确保MainActivity能识别有效返回
  • 刷新RecyclerView时优先用notifyItemInserted()而非notifyDataSetChanged(),提升性能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:10:30