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

RecyclerView无法更新问题:添加Worker后列表仅首次刷新

RecyclerView添加Worker后无法刷新的问题解决

问题根源

  1. 每次点击添加按钮时重复执行recyclerView.setAdapter(myAdapter),属于多余操作,还会干扰Adapter的状态。
  2. 向Workers集合添加新数据后,没有通知Adapter数据已变更,导致RecyclerView不知道要刷新列表。

修复步骤

1. 调整MainActivity的按钮点击逻辑

把Adapter提升为Activity的成员变量,初始化时仅设置一次Adapter,添加数据后通知Adapter更新:

public class MainActivity extends AppCompatActivity {

    Button save;
    ArrayList<Worker> Workers = new ArrayList<>();
    RecyclerView recyclerView;
    MyAdapter myAdapter; // 改为成员变量,方便点击事件中调用

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

        recyclerView = findViewById(R.id.recyclerView);
        save = findViewById(R.id.buttonAdd);

        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        myAdapter = new MyAdapter(this, Workers);
        recyclerView.setAdapter(myAdapter); // 初始化时仅设置一次Adapter

        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if() {
                    // 保留原有的判断逻辑
                } else {
                    if(Worker.ExChange(getInputOne) == 0) {
                        // 保留原有的逻辑
                    } else {
                        Worker newWorker = new Worker(0, getInput, getInputOne, spinnerTeam.getSelectedItem().toString(), Worker.ExChange(getInputOne), 0, "X", "X");
                        Workers.add(newWorker);
                        spinnerTeam.setSelection(0);
                        
                        // 通知Adapter新增了一条数据,局部刷新性能更好
                        myAdapter.notifyItemInserted(Workers.size() - 1);
                        // 也可以用你Adapter里的update方法:myAdapter.update(Workers);
                    }
                    totlHoursUpdating.setText(new DecimalFormat("##.##").format(sumHours(Worker.ExChange(getInputOne))));
                    WorkerNameInput.setText(null);
                    WorkerTimeInput.setText(null);
                }
            }
        });
    }
}

2. 可选:优化Adapter的单条数据添加方法

如果想更高效地处理单条数据插入,可以在Adapter里新增一个方法,避免全量刷新:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

    // ... 保留原有代码 ...

    // 添加单条Worker并局部刷新
    public void addWorker(Worker worker) {
        workerList.add(worker);
        notifyItemInserted(workerList.size() - 1);
    }

    // ... 保留原有的update方法用于批量更新 ...
}

之后在MainActivity的点击事件里直接调用myAdapter.addWorker(newWorker)即可。


核心要点

  • Adapter只需在初始化时设置一次,无需每次点击都重复设置。
  • 修改数据集合后,必须调用Adapter的通知方法(如notifyItemInserted、notifyDataSetChanged),RecyclerView才会更新显示。

内容的提问来源于stack exchange,提问作者עמית ישי

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:05:54