如何正确更新RecyclerView数据,实现其他Activity修改后列表同步变更
问题解决步骤
你需要修改4个部分的代码,即可实现列表修改后自动刷新对应条目:
1. 修改MainActivity代码
将Adapter提升为全局变量,新增Activity Result回调接收编辑页返回的修改结果:
public class MainActivity extends AppCompatActivity { RecyclerView recyclerView; ArrayList<Cartuchos> arrayList; // 新增全局Adapter变量 RecyclerViewListaCartuchos adaptador; // 新增Activity Result launcher,接收编辑页返回数据 ActivityResultLauncher<Intent> editLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { Intent data = result.getData(); int modifyId = data.getIntExtra("modify_id", -1); int newQuantity = data.getIntExtra("new_quantity", -1); String newUpdateTime = data.getStringExtra("new_update_time"); if (modifyId == -1 || newQuantity == -1) return; // 遍历列表找到对应ID的条目位置 for (int i = 0; i < arrayList.size(); i++) { if (arrayList.get(i).getIdCartucho() == modifyId) { // 更新本地列表数据 Cartuchos item = arrayList.get(i); item.setCantidad(newQuantity); if (newUpdateTime != null) { item.setFechaModificacion(newUpdateTime); } // 刷新对应条目 adaptador.notifyItemChanged(i); break; } } } } ); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); arrayList = new ArrayList<>(); recyclerView = findViewById(R.id.rvInicio); recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this)); recyclerView.setHasFixedSize(true); listadoCartuchos(); } public void listadoCartuchos() { StringRequest stringRequest = new StringRequest(Request.Method.POST, "你的接口地址", response -> { try { arrayList.clear(); // 新增:先清空旧数据,避免重复加载 JSONArray jsonArray = new JSONArray(response); for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject1 = jsonArray.getJSONObject(i); int id = jsonObject1.getInt("dat"); String modelo = jsonObject1.getString("da"); String color = jsonObject1.getString("d"); String fec = jsonObject1.getString("data"); int cantidad = jsonObject1.getInt("cantidad"); arrayList.add(new Cartuchos(id, modelo, color, fec, cantidad)); } // 只在第一次初始化Adapter,后续不需要重复set if (adaptador == null) { adaptador = new RecyclerViewListaCartuchos(MainActivity.this, arrayList, editLauncher); recyclerView.setAdapter(adaptador); } else { adaptador.notifyDataSetChanged(); } } catch (JSONException e) { e.printStackTrace(); } }, Throwable::printStackTrace); RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this); requestQueue.add(stringRequest); } }
2. 修改RecyclerViewAdapter代码
新增构造参数接收Activity Result launcher,删除跳转时的NEW_TASK标记:
public class RecyclerViewListaCartuchos extends RecyclerView.Adapter<RecyclerViewListaCartuchos.ViewHolder> { ArrayList<Cartuchos> mValues; Context mContext; // 新增launcher变量 ActivityResultLauncher<Intent> editLauncher; // 修改构造方法 public RecyclerViewListaCartuchos(Context context, ArrayList<Cartuchos> values, ActivityResultLauncher<Intent> editLauncher) { mValues = values; mContext = context; this.editLauncher = editLauncher; } @NonNull @Override public RecyclerViewListaCartuchos.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.vista_diseno_cartucho, parent, false); return new RecyclerViewListaCartuchos.ViewHolder(view); } @Override public void onBindViewHolder(RecyclerViewListaCartuchos.ViewHolder Vholder, int position) { Vholder.setData(mValues.get(position)); } @Override public int getItemCount() { return mValues.size(); } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public CardView cardView; public TextView idCartucho; public TextView modeloColor; public TextView tv_fecha_mod_usuario_mod; public ImageView iv_cartucho_img; public View layout; Cartuchos item; public ViewHolder(View v) { super(v); layout = v; v.setOnClickListener(this); cardView = v.findViewById(R.id.cardView); idCartucho = v.findViewById(R.id.idCartucho); modeloColor = v.findViewById(R.id.tv_modelo_color); tv_fecha_mod_usuario_mod = v.findViewById(R.id.tv_fecha_mod_usuario_mod); iv_cartucho_img = v.findViewById(R.id.iv_cartucho_img); switch (mContext.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) { case Configuration.UI_MODE_NIGHT_YES: case Configuration.UI_MODE_NIGHT_NO: cardView.setBackgroundColor(mContext.getResources().getColor(R.color.white)); idCartucho.setTextColor(mContext.getResources().getColor(R.color.black)); modeloColor.setTextColor(mContext.getResources().getColor(R.color.black)); tv_fecha_mod_usuario_mod.setTextColor(mContext.getResources().getColor(R.color.black)); break; } } public void setData(Cartuchos item) { this.item = item; String dato = item.getModelo() + " " + item.getColor(); String idC = String.valueOf(item.getIdCartucho()); String fec_us = "Última actualización: " + item.getFechaModificacion(); idCartucho.setText(idC); modeloColor.setText(dato); tv_fecha_mod_usuario_mod.setText(fec_us); if(item.getModelo().contains("73")){ iv_cartucho_img.setImageResource(R.drawable.sietetresn); }else if(item.getModelo().contains("90")){ iv_cartucho_img.setImageResource(R.drawable.nueveceron); } } @Override public void onClick(View view) { Intent abrirEditar = new Intent(mContext, Editar.class); abrirEditar.putExtra("idcartucho", String.valueOf(item.getIdCartucho())); abrirEditar.putExtra("cantidad", String.valueOf(item.getCantidad())); // 删掉原来的FLAG_ACTIVITY_NEW_TASK,用launcher启动 editLauncher.launch(abrirEditar); } } }
3. 修改Editar页面代码
修改成功后将最新数据返回给主页面:
public class Editar extends AppCompatActivity { private EditText etEditarCantidad; private final String mensajeVacio = "No puede estar vacío ni el valor debe ser 0 (cero)"; private int cartuchoId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_editar); String idC = getIntent().getStringExtra("idcartucho"); cartuchoId = Integer.parseInt(idC); String cantidad = getIntent().getStringExtra("cantidad"); etEditarCantidad = findViewById(R.id.etEditarCantidad); etEditarCantidad.setText(cantidad); Button btnEditar = findViewById(R.id.btnEditar); btnEditar.setOnClickListener(v -> { if(etEditarCantidad.getText().toString().length() == 0 || etEditarCantidad.getText().toString().equals("0")){ Toast.makeText(Editar.this, mensajeVacio, Toast.LENGTH_SHORT).show(); }else{ try{ editarCantidad(cartuchoId); }catch (Exception e){ Log.e("Error", "Editar error: " + e.getMessage()); } } }); } private void editarCantidad(int id){ if(TextUtils.isEmpty(etEditarCantidad.getText().toString())){ etEditarCantidad.setError("No puede estar vacío."); etEditarCantidad.requestFocus(); return; } String url = "你的编辑接口地址"; final int cant = Integer.parseInt(etEditarCantidad.getText().toString()); StringRequest stringRequest = new StringRequest(Request.Method.POST, url, response -> { try { if (response.contains("Error")) { Toast.makeText(Editar.this, "Lo sentimos, ha ocurrido un error.", Toast.LENGTH_SHORT).show(); } else { Intent data = new Intent(); // 把修改后的数据返回给主页面 data.putExtra("modify_id", cartuchoId); data.putExtra("new_quantity", cant); // 如果你的PHP接口返回了最新的修改时间,也可以解析后加在这里 // data.putExtra("new_update_time", 解析出来的时间); setResult(RESULT_OK, data); Toast.makeText(Editar.this, "Modificado con éxito.", Toast.LENGTH_SHORT).show(); finish(); } } catch (Exception e) { e.printStackTrace(); } }, error -> Log.e("onErrorEdit", "onErrorResponse: " + error.getMessage())){ @Override protected Map<String, String> getParams(){ Map<String, String> parametros = new HashMap<>(); parametros.put("cantidad", String.valueOf(cant)); parametros.put("id", String.valueOf(id)); return parametros; } }; RequestQueue requestQueue = Volley.newRequestQueue(Editar.this); requestQueue.add(stringRequest); } }
4. 补充Cartuchos实体类方法
检查你的Cartuchos类是否有setCantidad、setFechaModificacion属性对应的set方法,没有的话补充即可。
内容的提问来源于stack exchange,提问作者user14351570
相关产品推荐
相关产品推荐

