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

