RecyclerView无法更新问题:添加Worker后列表仅首次刷新
RecyclerView添加Worker后无法刷新的问题解决
问题根源
- 每次点击添加按钮时重复执行
recyclerView.setAdapter(myAdapter),属于多余操作,还会干扰Adapter的状态。 - 向
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,提问作者עמית ישי
相关产品推荐
相关产品推荐

