2017-07-17 4 views
0

ich einen Code haben:Android Listview-Update-Artikel, Firebase Datenbank

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ......... 

    listViewMyAccountSettings = (ListView) findViewById(R.id.listViewMyAccountSettings); 
    arrayList = new ArrayList(); 
    arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, arrayList); 
    listViewMyAccountSettings.setAdapter(arrayAdapter); 
    arrayAdapter.notifyDataSetChanged(); 



    listViewMyAccountSettings.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      if (position == 0){ 
       showAlertUsername(); 
      } else if (position == 1){ 
       showAlertAge(); 

      } 
      ...................... 
     } 
    }); 
     ................. 
    FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference myRef = database.getReference("userdata").child(myEmail).child("username"); 
    myRef.addValueEventListener(new ValueEventListener() { 
     @SuppressLint("SetTextI18n") 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // This method is called once with the initial value and again 
      // whenever data at this location is updated. 
      username = dataSnapshot.getValue(String.class); 
      arrayList.add("Your username: " + username); 
     } 

     @Override 
     public void onCancelled(DatabaseError error) { 
      // Failed to read value 
      Log.w("TAG", "Failed to read value.", error.toException()); 
     } 
    }); 

Es gibt showAlertUsername Methode:

private void showAlertUsername() { 
    alertDialogBuilder = new AlertDialog.Builder(
      MyAccountSettings.this); 
    input = new EditText(MyAccountSettings.this); 
    lp = new LinearLayout.LayoutParams(
      LinearLayout.LayoutParams.MATCH_PARENT, 
      LinearLayout.LayoutParams.MATCH_PARENT); 
    input.setLayoutParams(lp); 
    alertDialogBuilder.setView(input); 
    alertDialogBuilder.setPositiveButton("Discard", 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
        Toast.makeText(getApplicationContext(), "No changes were made", 
          Toast.LENGTH_SHORT).show(); 
       } 
      }); 

    alertDialogBuilder 
      .setTitle("USERNAME") 
      .setMessage("Enter new username") 
      .setCancelable(false) 
      .setNegativeButton("Change", 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          if (!input.getText().toString().isEmpty()) { 
           mDatabase.child("userdata").child(myEmail).child("username").setValue(input.getText().toString()); 
           Toast.makeText(getApplicationContext(), "Your username was changed successfully", 
             Toast.LENGTH_LONG).show(); 
           listViewMyAccountSettings.invalidateViews(); 
          } else { 
           Toast.makeText(getApplicationContext(), "Username can't be empty. No changes were made", 
             Toast.LENGTH_LONG).show(); 
          } 
         } 
        }); 

    AlertDialog alert = alertDialogBuilder.create(); 
    alert.show(); 
} 

Und ich möchte bestimmtes Feld in der Listenansicht aktualisieren, wenn ich Wert zu ändern (und setze es in die Datenbank). Problem ist, dass, wenn ich den Wert in der Datenbank ändere, ein neues Element zur Listenansicht mit neuem Wert hinzufügt? Gibt es eine Möglichkeit, die alte zu aktualisieren, ohne eine Aktivität neu zu starten? Vielen Dank.

Antwort

0

Jedes Mal, wenn die Feuerbasis Daten geändert werden Sie ein neues Element zur Liste hinzufügen:

public void onDataChange(DataSnapshot dataSnapshot) { 
    // This method is called once with the initial value and again 
    // whenever data at this location is updated. 
    username = dataSnapshot.getValue(String.class); 
    arrayList.add("Your username: " + username); 
} 

Löschen der Liste, wenn sie vor, dass, wenn Sie einen einzelnen Eintrag haben wollen.

public void onDataChange(DataSnapshot dataSnapshot) { 
    // This method is called once with the initial value and again 
    // whenever data at this location is updated. 
    arrayList.clear(); 
    username = dataSnapshot.getValue(String.class); 
    arrayList.add("Your username: " + username); 
    arrayAdapter.notifyDataSetChanged(); 
} 
+0

Ja, ich dachte über seine Art und Weise, aber ich habe 3 OnDataChange Methoden, weil ich drei Felder in der Datenbank zu aktualisieren (Benutzername, Alter und Geschlecht), so wird diese 2 Elemente löschen und nur 1 im Array gelassen werden – Samo

+0

Vielleicht ist eine Listenansicht nicht die ideale Komponente für Ihren Anwendungsfall. Alternativ können Sie sich die Änderungen in der Basis-Tabelle ".child (myEmail)" anhören und die 3 Felder, die Sie interessieren, für ein einzelnes Änderungsereignis erhalten. – Natan

0

würden Sie die Daten ändern, wenn Ihre aktuelle Arraylist enthält hinzufügen, sonst nur die neue:

public void onDataChange(DataSnapshot dataSnapshot) { 
    username = dataSnapshot.getValue(String.class); 
    String item = "Your username: " + username; 

    if(arrayList.contains(item)) { 
     //if current arrayList contains the item just change it 
     arrayList.set(arrayList.indexOf(item), item); 
    } else { 
     //otherwise add the new one 
     arrayList.add(item); 
    } 
    //assuming your data is mutable 
    arrayAdapter.notifyDataSetChanged(); 
} 
0

Verwenden ChildEventListener statt ValueEventListener.ChildEventListener gibt die folgende über Methoden,

@Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
    } 

    @Override 
    public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
    // here in dataSnapshot you will the detail for which the value is changed,using this you can update the list. 
    } 

    @Override 
    public void onChildRemoved(DataSnapshot dataSnapshot) {} 

    @Override 
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {} 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
0

@Priya danke ein gebrauchtes Stück deiner Antwort, der Code sieht nun so aus und es macht was es soll.

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference myRef = database.getReference("userdata").child(myEmail); 
    myRef.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) { 
      if (dataSnapshot.getKey().equals("username")) { 
       username = (String) dataSnapshot.getValue(); 
       arrayList.add("Username: " + username); 
      } else if (dataSnapshot.getKey().equals("age")) { 
       age = (String) dataSnapshot.getValue(); 
       arrayList.add("Age: " + age); 
      } else if (dataSnapshot.getKey().equals("gender")) { 
       gender = (String) dataSnapshot.getValue(); 
       arrayList.add("Gender: " + gender); 
      } 
     } 
     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) { 
      if (dataSnapshot.getKey().equals("username")) { 
       username = (String) dataSnapshot.getValue(); 
       arrayList.set(2, "Username: " + username); 
      } else if (dataSnapshot.getKey().equals("age")) { 
       age = (String) dataSnapshot.getValue(); 
       arrayList.set(0, "Age: " + age); 
      } else if (dataSnapshot.getKey().equals("gender")) { 
       gender = (String) dataSnapshot.getValue(); 
       arrayList.set(1, "Gender: " + gender); 
      } 
      arrayAdapter.notifyDataSetChanged(); 
     } 
     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) {} 
     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {} 
     @Override 
     public void onCancelled(DatabaseError databaseError) {} 
    });