Android开发:如何从其他类向RecyclerView添加条目并更新列表?
RecyclerView添加条目不显示的问题解决
问题描述
尝试从另一个页面向RecyclerView添加条目,程序无报错但新条目不显示。场景为:首页(Home.java)展示列表,点击浮动按钮跳转至添加页面(AddItem.java);用户输入条目信息后点击添加按钮返回首页,列表需自动更新。
相关代码
Home.java
public class Home extends AppCompatActivity{ private FirebaseAuth mAuth; private FloatingActionButton addItemFab; private RecyclerView recyclerView; // The adapter is responsible for loading the items in the recycler view we need. This ensures good performance private RecyclerView.Adapter adapter; // The layout manager is responsible for laying out the items in the Recycler view private RecyclerView.LayoutManager layoutManager; private ArrayList<Item> itemList; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.home_activity); // Initialize Firebase Auth mAuth = FirebaseAuth.getInstance(); // floating action button to add an item page addItemFab = findViewById(R.id.addItemFab); addItemFab.setOnClickListener(view -> { Intent intent = new Intent(Home.this, AddItem.class); startActivity(intent); }); itemList = new ArrayList<Item>(); // add item for testing itemList.add(new Item(R.drawable.ic_logo, "Baby Stroller", "A stroller for baby", "59.99")); recyclerView = findViewById(R.id.recyclerView); recyclerView.setHasFixedSize(true); layoutManager = new LinearLayoutManager(this); adapter = new Adapter(itemList); adapter.notifyItemInserted(itemList.size()-1); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(adapter); } // log out back to start page public void goToStart(View view){ Intent intent = new Intent(this, MainActivity.class); startActivity(intent); } }
Adapter.java
public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder>{ private ArrayList<Item> ItemList; public static class ViewHolder extends RecyclerView.ViewHolder{ public ImageView item_image; public TextView item_name; public TextView item_desc; public TextView item_price; public ViewHolder(@NonNull View itemView) { super(itemView); item_image = itemView.findViewById(R.id.item_image); item_name = itemView.findViewById(R.id.item_name); item_desc = itemView.findViewById(R.id.desc); item_price = itemView.findViewById(R.id.price); } } public Adapter(ArrayList<Item> itemList) {ItemList = itemList;} @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_items, parent, false); ViewHolder vh = new ViewHolder(v); return vh; } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { Item currentItem = ItemList.get(position); holder.item_image.setImageResource(currentItem.getItemImage()); holder.item_name.setText(currentItem.getItemName()); holder.item_desc.setText(currentItem.getItemDesc()); holder.item_price.setText(currentItem.getItemPrice()); } @Override public int getItemCount() { return ItemList.size(); } }
Item.java
public class Item { private int itemImage; private String itemName; private String itemDesc; private String itemPrice; public Item(int itemImage, String itemName, String itemDesc, String itemPrice){ this.itemImage = itemImage; this.itemName = itemName; this.itemDesc = itemDesc; this.itemPrice = itemPrice; } public int getItemImage(){return itemImage;} public String getItemName(){return itemName;} public String getItemDesc(){return itemDesc;} public String getItemPrice(){return itemPrice;} }
AddItem.java
public class AddItem extends AppCompatActivity { ImageView itemImage; EditText itemName; EditText itemPrice; EditText itemDesc; private ArrayList<Item> itemList; @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.add_item_activity); itemImage = findViewById(R.id.image_holder); itemName = findViewById(R.id.add_item_name); itemPrice = findViewById(R.id.add_price); itemDesc = findViewById(R.id.add_desc); itemList = new ArrayList<Item>(); } public void addItem(View view) { itemList.add(new Item(R.drawable.ic_logo, itemName.getText().toString(), itemPrice.getText().toString(), itemDesc.getText().toString())); Intent intent = new Intent(this, Home.class); startActivity(intent); } }
问题根源
- 数据不共享:AddItem中创建的
itemList是局部新集合,和Home中的itemList是完全独立的对象,新增条目根本没进入Home的列表。 - 页面重建问题:点击添加按钮后重新启动Home,原Home实例被销毁,新启动的Home会重新初始化
itemList,自然看不到新增条目。
解决方案
方案一:使用startActivityForResult传递数据(推荐轻量场景)
- 修改Home中启动AddItem的代码,改用
startActivityForResult:
addItemFab.setOnClickListener(view -> { Intent intent = new Intent(Home.this, AddItem.class); startActivityForResult(intent, 100); // 100为自定义请求码 });
- 在Home中重写
onActivityResult方法,接收返回数据并更新列表:
@Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 100 && resultCode == RESULT_OK && data != null) { int image = data.getIntExtra("itemImage", R.drawable.ic_logo); String name = data.getStringExtra("itemName"); String price = data.getStringExtra("itemPrice"); String desc = data.getStringExtra("itemDesc"); Item newItem = new Item(image, name, desc, price); itemList.add(newItem); adapter.notifyItemInserted(itemList.size() - 1); } }
- 修改AddItem的
addItem方法,返回数据并关闭当前页面,不再重启Home:
public void addItem(View view) { String name = itemName.getText().toString().trim(); String price = itemPrice.getText().toString().trim(); String desc = itemDesc.getText().toString().trim(); if (!name.isEmpty() && !price.isEmpty()) { Intent resultIntent = new Intent(); resultIntent.putExtra("itemImage", R.drawable.ic_logo); resultIntent.putExtra("itemName", name); resultIntent.putExtra("itemPrice", price); resultIntent.putExtra("itemDesc", desc); setResult(RESULT_OK, resultIntent); finish(); // 返回原Home页面 } }
- 删除AddItem中的
private ArrayList<Item> itemList;,无需再维护局部集合。
方案二:全局单例管理数据(适合多页面共享场景)
创建全局数据管理类:
public class ItemManager { private static ItemManager instance; private ArrayList<Item> itemList; private ItemManager() { itemList = new ArrayList<>(); // 初始化测试数据 itemList.add(new Item(R.drawable.ic_logo, "Baby Stroller", "A stroller for baby", "59.99")); } public static synchronized ItemManager getInstance() { if (instance == null) { instance = new ItemManager(); } return instance; } public ArrayList<Item> getItemList() { return itemList; } public void addItem(Item item) { itemList.add(item); } }
修改Home的onCreate方法,从单例获取列表:
@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.home_activity); // ... 其他初始化代码 // 替换原itemList初始化,从全局管理器获取 itemList = ItemManager.getInstance().getItemList(); recyclerView = findViewById(R.id.recyclerView); recyclerView.setHasFixedSize(true); layoutManager = new LinearLayoutManager(this); adapter = new Adapter(itemList); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(adapter); }
修改AddItem的addItem方法,向全局集合添加条目:
public void addItem(View view) { String name = itemName.getText().toString().trim(); String price = itemPrice.getText().toString().trim(); String desc = itemDesc.getText().toString().trim(); if (!name.isEmpty() && !price.isEmpty()) { Item newItem = new Item(R.drawable.ic_logo, name, desc, price); ItemManager.getInstance().addItem(newItem); finish(); // 返回Home } }
重写Home的onResume方法,确保回到前台时刷新列表:
@Override protected void onResume() { super.onResume(); adapter.notifyDataSetChanged(); }
内容的提问来源于stack exchange,提问作者Hamza Khan
相关产品推荐
相关产品推荐

