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

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);
}
}

问题根源

  1. 数据不共享:AddItem中创建的itemList是局部新集合,和Home中的itemList是完全独立的对象,新增条目根本没进入Home的列表。
  2. 页面重建问题:点击添加按钮后重新启动Home,原Home实例被销毁,新启动的Home会重新初始化itemList,自然看不到新增条目。

解决方案

方案一:使用startActivityForResult传递数据(推荐轻量场景)

  1. 修改Home中启动AddItem的代码,改用startActivityForResult:
addItemFab.setOnClickListener(view -> {
    Intent intent = new Intent(Home.this, AddItem.class);
    startActivityForResult(intent, 100); // 100为自定义请求码
});
  1. 在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);
    }
}
  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页面
    }
}
  1. 删除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:05:29