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

如何正确更新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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:39:03