2017-01-25 7 views
0

Ich muss Elemente dynamisch zur Listenansicht hinzufügen.Dynamischen Artikel zur Listenansicht hinzufügen

Jetzt benutze ich FAB (crearEntrenamintoActivity), um eine neue Aktivität (crearEjercicioActivity) zu öffnen und hier die notwendigen Daten des neuen Eintrags, der in die Listenansicht eingefügt werden soll, zu vervollständigen.

Aber auf diese Weise muss ich die ParcableExtra alle Zeit zwischen beiden Aktivitäten übergeben.

Gibt es einen einfacheren Weg, dies zu tun?

Edit:

hier, wenn ich drücken FAB-Taste i die extra „entrenamiento“ an die neue Aktivität senden, weil ich alle Elemente der Listenansicht in dieses Objekt speichern müssen.

public void initFAB() { 
     FloatingActionButton floatingActionButton = (FloatingActionButton) findViewById(R.id.fabCrearEntrenamiento); 
     if (floatingActionButton != null) { 
      floatingActionButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        //lanzamos la actividad de crear ejercicio 
        entrenamiento.setUbicacion(etUbicacion.getText().toString()); 
        entrenamiento.setHoraInicio(etHoraInicio.getText().toString()); 
        Intent intent = new Intent(getApplicationContext(), CrearEjercicioActivity.class); 
        intent.putExtra("entrenamiento", entrenamiento); 
        startActivity(intent); 
       } 
      }); 
     } 
    } 

Dann in "crearEjercicioActivity" habe ich dies. Hier, wenn ich die Speichern-Taste drücke, füge ich in der ArrayListe das neue Element hinzu.

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.action_save: 
       Entrenamiento entrenamiento = getIntent().getParcelableExtra("entrenamiento"); 
       Ejercicio ejercicio = new Ejercicio(); 
       EditText titulo = (EditText) findViewById(R.id.etTituloEjercicio); 
       ejercicio.setTitulo(titulo.getText().toString()); 
       entrenamiento.getEjercicios().add(ejercicio); 
       Intent intentEjercicio = new Intent(getApplicationContext(), CrearEntrenamientoActivity.class); 
       intentEjercicio.putExtra("entrenamiento", entrenamiento); 
       startActivity(intentEjercicio); 
       return true; 
      case R.id.action_home: 
       Intent intent = new Intent(getApplicationContext(), DashBoardActivity.class); 
       startActivity(intent); 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

Und schließlich ich das tun:

if (entrenamiento.getEjercicios().size() > 0) { 
      ListView listViewEjercicios = (ListView) findViewById(R.id.listViewEjercicios); 
      ArrayList<String> titulosEjercicios = new ArrayList<>(); 

      for (Ejercicio ejercicio : entrenamiento.getEjercicios()) { 
       titulosEjercicios.add(ejercicio.getTitulo()); 
      } 

      ArrayAdapter<String> listAdapter = new ArrayAdapter<>(this, R.layout.simple_row_ejercicio_layout, titulosEjercicios); 
      if (listViewEjercicios != null) { 
       listViewEjercicios.setAdapter(listAdapter); 
      } 
     } 
+1

Können Sie ein bisschen mehr oder Code zu setzen erklären? – adalPaRi

+0

Einige Code bitte – tpk

+0

Ja, tut mir leid. Ich bearbeite. – garciam202

Antwort

2

Ich würde eine Manager-Klasse für diese Singleton empfehlen. Der Manager sollte eine Datenstruktur wie eine Liste oder eine Karte enthalten. Dort können Sie Ihre Objekte speichern. Wenn Sie einen neuen Objektaufruf manager.add(yourobject) hinzufügen möchten. Zusätzlich können Sie etwas wie einen Notify-Rückruf erhalten. Jede Ansicht, die die Daten des Managers verwendet, muss Ihren Callback implementieren. Registrieren Sie die Ansichten auf dem Manager mit manager.registerCallback(). Und jedes Mal, wenn Sie die Daten des Managers wie add() oder remove() ändern, müssen Sie notifyCallbacks() anrufen.

Wenn Sie meine Lösung implementieren, müssen Sie nicht mehrere Adapterobjekte erstellen. Sie arbeiten mit einem Listen-/Kartenobjekt, das in Ihrem Manager gespeichert ist. Und nachdem Sie die Daten geändert haben, rufen Sie einfach adapter.notifyDataSetChanged().

mein Codebeispiel zu diesem Beitrag Check: Unable to refresh listview data within same fragments used under different tabs

+0

ich verstehe nicht sehr gut. Kannst du mir etwas mehr erklären? Ich habe zwei Aktivitäten, die erste enthält Listenansicht und startet die zweite Aktivität, In der zweiten Aktivität speichere ich ein neues Element, das in der Listenansicht der ersten Aktivität enthalten sein wird. – garciam202

+0

Momentan übergeben Sie die Daten der Listenansicht mit 'parceableExtra' an die zweite Aktivität. Jetzt in Ihrer zweiten Aktivität haben Sie eine Kopie dieses übergebenen Artikels. Sie legen einen neuen Artikel für die Kopie fest. Zum Schluss setzen Sie einen neuen Adapter. Mit meiner Lösung arbeiten Sie nicht mit Kopien. Sie haben einen Manager, der die Objekte speichert. Es gibt keine Kopien mehr. Sie müssen 'setAdapter()' nicht mehrmals aufrufen. Sie arbeiten immer mit der gleichen Liste. Am Ende müssen Sie nur 'adapter.notifyDataSetChanged()' aufrufen, anstatt einen neuen Adapter zu erstellen. – beeb

+0

ja. aber ich verstehe nicht die Beziehung zwischen dem Adapter und dem Manager. in der zweiten Aktivität rufe ich addMovie (Film) auf, die notifyCallbacks() aufrufen; where loop m_MovieChangedCallbacks Aufruf von onMoviesChanged() in CDMBasicMovieFragment, aber was ist das? CDMBasicMovieFragment sollte meine erste Aktivität sein? Und was ist der Unterschied zwischen m_Movies und m_MovieChangedCallbacks? Entschuldigung für meine Zweifel – garciam202

0

Sie nur eine Aktivität verwenden könnte und dann Fragmente haben für jede Ihrer zwei Ansichten. Die Aktivität kann dann den Verweis auf Ihr Element enthalten und die Kommunikation zwischen den beiden Fragmenten durch Aufrufen von öffentlichen Methoden für sie steuern (like described here at the bottom).

Wenn Sie bei Aktivitäten bleiben wollen, sind die Absichten wahrscheinlich der empfohlene Ansatz.

+0

Aber ich brauche, dass das listfragment Neue Aktivität startet und dann das listfragment mit dem neuen Element aktualisiert. Wie kann ich beides kommunizieren? – garciam202

Verwandte Themen