有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在RecyclerView中正确更新数据,以便在插入或更新来自其他活动的数据后查看更改

我遇到了一个问题,我正试图从RecyclerView加载MySQL查询中的信息的update数据。为此,通过在RecyclerView中的一个项目上单击,我打开一个新的Activity,在这个位置上输入RecyclerView项目的数据并更新它。在我的DB中,我看到了更新,但是当我返回带有列表的Activity时,没有做出改变。我明白,为了实现这一点,我应该使用^{;我不明白的是如何在我的^{中正确地应用它。这是我的Adapter

public class RecyclerViewListaCartuchos extends RecyclerView.Adapter<RecyclerViewListaCartuchos.ViewHolder> {
    ArrayList<Cartuchos> mValues;
    Context mContext;

    public RecyclerViewListaCartuchos(Context context, ArrayList<Cartuchos> values) {
        mValues = values;
        mContext = context;
    }

    @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) {
            int itemPosition = getLayoutPosition();
            String idC = String.valueOf(idCartucho.getText());
            String cantidad = String.valueOf(item.getCantidad());
            //String mensaje = itemPosition + " / " + idC + "/Canti:" + cantidad;
            Intent abrirEditar = new Intent(mContext, Editar.class);
            abrirEditar.putExtra("idcartucho", String.valueOf(item.getIdCartucho()));
            abrirEditar.putExtra("cantidad", String.valueOf(item.getCantidad()));
            abrirEditar.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mContext.startActivity(abrirEditar);
            //Toast.makeText(mContext, mensaje, Toast.LENGTH_SHORT).show();
        }
    }
}

这是我的activity

public class MainActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    ArrayList<Cartuchos> arrayList;

    @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, "url",
                response -> {
                    try {
                        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));
                        }
                        RecyclerViewListaCartuchos adaptador = new RecyclerViewListaCartuchos(getApplicationContext(), arrayList);
                        recyclerView.setAdapter(adaptador);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }, Throwable::printStackTrace);
        RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
        requestQueue.add(stringRequest);
    }
}

编辑活动:

public class Editar extends AppCompatActivity {
    private EditText etEditarCantidad;
    private final String mensajeVacio = "No puede estar vacío ni el valor debe ser 0 (cero)";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_editar);
        String idC = getIntent().getStringExtra("idcartucho");
        int id = 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(id);
                }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 = "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 = getIntent();
                    //put necessary data if there's any and send it back
                    setResult(1, data);
                    Toast.makeText(Editar.this, "Modificado con éxito.", Toast.LENGTH_SHORT).show();
                    Editar.this.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);
    }
}

共 (1) 个答案

  1. # 1 楼答案

    您应该使用startActivityForResult来启动另一个活动,当另一个活动关闭时,主活动中的onActivityResult会被触发,因此当这种情况发生时,您知道另一个活动已完成其工作,您应该从数据库中更新该项

    事情是这样的:

    1. main activity调用startActivityForResult (Intent intent, int requestCode)来启动第二个activity,目的是包含第二个activity中要使用的数据和一个整数请求代码,以指示要打开的活动(我们稍后将使用)
    2. 第二个活动完成所需的工作,提供主活动的意图,就在它调用finish之前,它应该调用setResult(int resultCode, Intent data)
      其中结果代码:一个整数,用于指示它所做的工作是否导致成功或失败(可以是您指定的任何整数,例如1表示成功,0表示失败)
      数据:是一个包含第二个活动中的一些数据的意图,为了我们的案例,只需将第二个活动中收到的相同意图发送给第一个,因为它包含必要的数据
    3. 因为你用startActivityForResult开始了你的第二个活动,当它完成时,onActivityResult (int requestCode, int resultCode, Intent data)在主活动中使用requestCode调用,您应该使用if语句打开它,以确保它是启动第二个活动的requestCode(如果第三个活动执行其他操作,那么当它返回时,您将携带正确的操作流),以及应该表明你在做哪项工作的数据
    4. 既然你有了所需的数据,你就可以在这里再次查询你的数据库,以正确地更新所提到的项目,然后调用adapter.notifyItemChanged

    你的主要活动应该是:

    public class MainActivity extends AppCompatActivity {
        private final int MY_SECOND_ACTIVITY_REQUEST_CODE =2 , MY_THIRD_ACTIVITY_REQUEST_CODE =3 ;
        private final int RESULT_SUCCESS =1 , RESULT_FALIURE =0;
    
        ... 
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            if (requestCode == MY_SECOND_ACTIVITY_REQUEST_CODE){
                if (resultCode ==RESULT_SUCCESS)
                    SecondActivityFinishedUpdateAdapterData(data);
                else somethingWrongHappenedInSecondActivity();
            }else if (requestCode == MY_THIRD_ACTIVITY_REQUEST_CODE){
                //do something else here in case if you have third activity
            }else  super.onActivityResult(requestCode, resultCode, data);
        }
        
        public void startMyActivity(Intent data)
        {
            startActivityForResult(data), MY_SECOND_ACTIVITY_REQUEST_CODE );
        }
    }
    
    

    您的视图持有者应该携带对您的主要活动的引用,以便能够调用startActivityForResult(我不确定这是正确的方式,但目前我想不出任何其他方式),因此它可能看起来像这样:

    public class RecyclerViewListaCartuchos extends RecyclerView.Adapter<RecyclerViewListaCartuchos.ViewHolder> {
        ArrayList<Cartuchos> mValues;
        Context mContext;
        MainActivity myMainActivity
        public RecyclerViewListaCartuchos(MainActivity mainActivity, Context context, ArrayList<Cartuchos> values) {
            mValues = values;
            mContext = context;
            this.myMainActivity = mainActivity ;
        }
        ...
            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;
            MainActivity myMainActivity ;
            public ViewHolder(View v, MainActivity mainActivity) {
                super(v);
                this.myMainActivity = mainActivity ;
                ...
            }
    
            @Override
            public void onClick(View view) {
                int itemPosition = getLayoutPosition();
                String idC = String.valueOf(idCartucho.getText());
                String cantidad = String.valueOf(item.getCantidad());
                //String mensaje = itemPosition + " / " + idC + "/Canti:" + cantidad;
                Intent abrirEditar = new Intent(mContext, Editar.class);
                abrirEditar.putExtra("idcartucho", String.valueOf(item.getIdCartucho()));
                abrirEditar.putExtra("cantidad", String.valueOf(item.getCantidad()));
                abrirEditar.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
                myMainActivity.startMyActivity(abrirEditar);
    
                //mContext.startActivity(abrirEditar); //commented this
                //Toast.makeText(mContext, mensaje, Toast.LENGTH_SHORT).show();
            }
        }
    }
    

    在即将完成的第二个活动中,您应该这样调用setResult:

    Intent data = getIntent();
    //put necessary data if there's any and send it back
    setResult(1,data);
    finish()
    

    其中intent数据应包含必要的数据,以便在返回时更新适配器(如果有)。 例如,您可以在视图持有者onclick中使用holder.getAbsoulteAdapterPosition来获取单击的位置,并将其存储在意图中,该意图将被发送,以便稍后恢复到主活动onActivityResult