我在RecyclerView
内的fragment
中有一个Activity
,当我单击单击该RecyclerView
的元素时,它通过{{1} }到另一个类,在该类中该对象的值将其应用于某些bundle
。
如果其他editText
从另一个地方被调用而没有收到activity
;手动获取我放入Editext中的数据,然后将它们放到一个新的Object中。之后,通过带有bundle
的按钮将其上载到数据库。
但是如果接收到OnclickListener
,并且EditText被接收到的数据填充,我希望Button进行更新。
我如何获得bundle
(在创建该对象时)生成的key
,却知道该对象的所有其他数据(在firebase
中接收)
我需要做一个bundle
传递该对象的所有数据吗?还是有另一种(更简便的)方式?
如果我需要通过所有数据进行查询,该怎么办?
我需要传递的不仅仅是标题(例如),因为不存在唯一值
添加/修改Java类:
query
“ Juego”类(对象):
public class Addmod extends AppCompatActivity {
//Declaramos todos los objetos del XML mas algún string que servirá para pasar el valor luego a la BBDD
Button btnok;
Button btncan;
Spinner spnplat;
Spinner spnav;
EditText txtitl;
EditText txtvec;
RadioGroup rdgpos;
RadioGroup rdgfis;
RadioButton rdbtn1;
RadioButton rdbtn2;
String poses;
String fisic;
String avanc;
String plat;
//y la referencia de base de datos
DatabaseReference bbdd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_addmod);
//Asignamos a cada cosa lo suyo
btnok = (Button) findViewById(R.id.btnokadd);
btncan = (Button) findViewById(R.id.btncanceladd);
spnplat = (Spinner) findViewById(R.id.spnplatfo);
spnav = (Spinner) findViewById(R.id.spnavan);
txtitl = (EditText) findViewById((R.id.txtTitle));
txtvec = (EditText) findViewById(R.id.txtveces);
rdgpos = (RadioGroup) findViewById(R.id.rg);
rdgfis = (RadioGroup) findViewById(R.id.rg2);
poses = "No";
fisic = "No";
avanc = "Nulo";
plat = "PC";
//Le decimos dónde meter los datos en la BBDD
bbdd = FirebaseDatabase.getInstance().getReference("juegos");
// Creamos los listeners de los 2 botones importantes
final Intent i = getIntent();
final Juego jjj = i.getParcelableExtra("jue");
if (jjj != null){
txtitl.setText(jjj.getTitulo());
txtvec.setText(jjj.getVeces());
}
btnok.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// primero pasamos todos los valores a Strings
String titlo = txtitl.getText().toString();
String veces = txtvec.getText().toString();
avanc = spnav.getSelectedItem().toString();
plat = spnplat.getSelectedItem().toString();
// comprobamos que el juego tenga título
// si lo tiene, lo demás ya estaría puesto (aunque sea por defecto)
if(!TextUtils.isEmpty(titlo)){
if (!avanc.equals("Pasado") && !avanc.equals("Completado")) {
txtvec.setText("0");
veces = "0";
}
Juego j = new Juego(titlo,plat,poses,fisic,avanc,veces);
if (jjj == null){
String clave = bbdd.push().getKey();
bbdd.child(clave).setValue(j);
Toast toast = Toast.makeText(getApplicationContext(),"Añadido con éxito",Toast.LENGTH_SHORT);
toast.show();
Addmod.this.finish();
}else{
// aquí irá el modificar en la BBDD
String clave = bbdd.getKey();
Toast toast = Toast.makeText(getApplicationContext(),"Modificado con éxito",Toast.LENGTH_SHORT);
toast.show();
Addmod.this.finish();
}
}else{
Toast toast = Toast.makeText(getApplicationContext(),"Te falta el título",Toast.LENGTH_SHORT);
toast.show();
}
}
});
// El botón cancelar simplemente vuelve atrás sin realizar ningún cambio
btncan.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Toast toast = Toast.makeText(getApplicationContext(),"Operación cancelada",Toast.LENGTH_SHORT);
toast.show();
Addmod.this.finish();
}
});
// Aquí como en principio no querríamos añadir ninguna plataforma más, pasamos los valores a los spinner a través de un array.
String[] plataformas = new String[] {"PC", "PS2", "PS3", "PS4", "N64", "Gamecube", "Wii", "WiiU", "NSwitch", "Xbox", "Xbox360", "XboxOne", "PSone", "GameBoy", "GBA", "DS", "3DS", "PSP", "PSVita"};
String[] avance = new String[] {"Nulo", "Probado", "Intermedio", "Pasado", "Completado", "Irrelevante"};
ArrayAdapter<String> adaptaforms = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, plataformas);
ArrayAdapter<String> adaptavanc = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, avance);
spnplat.setAdapter(adaptaforms);
spnav.setAdapter(adaptavanc);
if (jjj != null){
switch (jjj.getPlataforma()){
case "PC":
spnplat.setSelection(0);
break;
case "PS2":
spnplat.setSelection(1);
break;
case "PS3":
spnplat.setSelection(2);
break;
case "PS4":
spnplat.setSelection(3);
break;
case "N64":
spnplat.setSelection(4);
break;
case "Gamecube":
spnplat.setSelection(5);
break;
case "Wii":
spnplat.setSelection(6);
break;
case "WiiU":
spnplat.setSelection(7);
break;
case "NSwitch":
spnplat.setSelection(8);
break;
case "Xbox":
spnplat.setSelection(9);
break;
case "Xbox360":
spnplat.setSelection(10);
break;
case "XboxOne":
spnplat.setSelection(11);
break;
case "PSone":
spnplat.setSelection(12);
break;
case "GameBoy":
spnplat.setSelection(13);
break;
case "GBA":
spnplat.setSelection(14);
break;
case "DS":
spnplat.setSelection(15);
break;
case "3DS":
spnplat.setSelection(16);
break;
case "PSP":
spnplat.setSelection(17);
break;
case "PSVita":
spnplat.setSelection(18);
break;
default:
spnplat.setSelection(0);
}
switch (jjj.getAvance()){
case "Nulo":
spnav.setSelection(0);
break;
case "Probado":
spnav.setSelection(1);
break;
case "Intermedio":
spnav.setSelection(2);
break;
case "Pasado":
spnav.setSelection(3);
break;
case "Completado":
spnav.setSelection(4);
break;
case "Irrelevante":
spnav.setSelection(5);
break;
default:
spnav.setSelection(0);
}
}
}
// Este método recoge el valor de los dos cuatro radiobutton y se encarga de pasarle la información como String (Si o No) cada vez que cambiamos cualquiera de los dos grupos
public void checkButton(View v){
int rdbposId = rdgpos.getCheckedRadioButtonId();
rdbtn1 = findViewById(rdbposId);
int rdbfisId = rdgfis.getCheckedRadioButtonId();
rdbtn2 = findViewById(rdbfisId);
//Toast toast = Toast.makeText(getApplicationContext(),"Ha seleccionado"+rdbtn1.getText()+" ",Toast.LENGTH_SHORT);
//toast.show();
poses = (rdbtn1.getText().toString());
fisic = (rdbtn2.getText().toString());
}
// Este método de momento es basura, pero serviría para cada vez que alguien escoge las opciones del Spinner
// "Nulo" o "irrelevante", automáticamente ponga a 0 el número de veces pasado (por si se ha modificado)
// y de paso, cambia el valor al string que almacena en cada momento que se cambia el valor del spinner
public void checkplat(View v){
avanc = spnav.getSelectedItem().toString();
if (!avanc.equals("Pasado")||!avanc.equals("Completado")){
txtvec.setText("0");
txtvec.setEnabled(false);
}else{
txtvec.setEnabled(true);
}
}
}
RecyclerView类(虽然是片段,但没有关系)
public class Juego implements Parcelable {
private String titulo;
private String plataforma;
private String posesion;
private String fisico;
private String avance;
private String veces;
public Juego(){
}
public Juego(String titulo, String plataforma, String posesion, String fisico, String avance, String veces) {
this.titulo = titulo;
this.plataforma = plataforma;
this.posesion = posesion;
this.fisico = fisico;
this.avance = avance;
this.veces = veces;
}
protected Juego(Parcel in) {
titulo = in.readString();
plataforma = in.readString();
posesion = in.readString();
fisico = in.readString();
avance = in.readString();
veces = in.readString();
}
public static final Creator<Juego> CREATOR = new Creator<Juego>() {
@Override
public Juego createFromParcel(Parcel in) {
return new Juego(in);
}
@Override
public Juego[] newArray(int size) {
return new Juego[size];
}
};
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public String getPlataforma() {
return plataforma;
}
public void setPlataforma(String plataforma) {
this.plataforma = plataforma;
}
public String getPosesion() {
return posesion;
}
public void setPosesion(String posesion) {
this.posesion = posesion;
}
public String getFisico() {
return fisico;
}
public void setFisico(String fisico) {
this.fisico = fisico;
}
public String getAvance() {
return avance;
}
public void setAvance(String avance) {
this.avance = avance;
}
public String getVeces() {
return veces;
}
public void setVeces(String veces) {
this.veces = veces;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(titulo);
dest.writeString(plataforma);
dest.writeString(posesion);
dest.writeString(fisico);
dest.writeString(avance);
dest.writeString(veces);
}
}
以及该回收站的Adapter类:
public class ListFragment extends Fragment implements View.OnClickListener{
private RecyclerView rcv;
private Adaptarecycler rAdapter;
private RecyclerView.LayoutManager layoutManager;
List<Juego> juegoss;
//private ListView lstvw;
DatabaseReference ddbbr;
public ListFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_list, container, false);
rcv = (RecyclerView) v.findViewById(R.id.recyclermini);
rcv.setLayoutManager(new LinearLayoutManager(getContext()));
juegoss = new ArrayList<>();
rAdapter = new Adaptarecycler(getContext(),juegoss);
rcv.setAdapter(rAdapter);
recarga();
/*
lstvw = v.findViewById(R.id.lstvwlistamini);
ddbbr = FirebaseDatabase.getInstance().getReference("juegos");
ddbbr.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
ArrayAdapter<String> adapter;
ArrayList<String> list = new ArrayList<String>();
for (DataSnapshot datasnapshot: dataSnapshot.getChildren()) {
Juego juego = datasnapshot.getValue(Juego.class);
String titulo = juego.getTitulo();
list.add(titulo);
}
adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,list);
lstvw.setAdapter(adapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
*/
return v;
}
// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
}
@Override
public void onDetach() {
super.onDetach();
}
@Override
public void onClick(View v) {
}
public interface OnFragmentInteractionListener {
// TODO: Update argument type and name
void onFragmentInteraction(Uri uri);
}
public void recarga(){
ddbbr = FirebaseDatabase.getInstance().getReference("juegos");
ddbbr.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
juegoss.clear();
for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren()){
Juego j1 = dataSnapshot1.getValue(Juego.class);
juegoss.add(j1);
}
Collections.reverse(juegoss);
rAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
我尝试通过标题传递查询,但是我想尽可能使用ID