2017-01-25 17 views
0

リストビューに項目を動的に追加する必要があります。リストビューに動的項目を追加する

私はFAB(crearEntrenamintoActivity)を使用して新しいアクティビティ(crearEjercicioActivity)を開き、ここでリストビューに追加する新しいアイテムの必要データを完成します。

しかし、このようにして、私は両方のアクティビティ間で常にparceableExtraを渡す必要があります。

もっと簡単な方法はありますか?

編集:ここでは

私はFABボタンを押したときに、私は、このオブジェクトにリストビューのすべてのアイテムを保存する必要があるため、私は新しい活動余分な「entrenamiento」に送ります。

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); 
       } 
      }); 
     } 
    } 

次に、「crearEjercicioActivity」にはこれがあります。ここで私がsaveボタンを押すと、arrayListに新しい項目を追加します。

@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); 
     } 
    } 

そして最後に、私はこれを行う:

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

あなたはもう少し説明したり、コードを入れることはできますか? – adalPaRi

+0

いくつかのコードをお願いします – tpk

+0

はい、申し訳ありません。私は編集する。 – garciam202

答えて

2

シングルトンのマネージャークラスをお勧めします。マネージャは、リストやマップのようなデータ構造を含める必要があります。そこにあなたのオブジェクトを保存することができます。新しいオブジェクト呼び出しmanager.add(yourobject)を追加したい場合。さらに、通知コールバックのようなものがあります。マネージャのデータを使用するすべてのビューは、コールバックを実装する必要があります。マネージャーのビューをmanager.registerCallback()に登録します。 add()remove()などのマネージャのデータを変更するたびにnotifyCallbacks()に電話する必要があります。

ソリューションを実装する場合、複数のアダプタオブジェクトを作成する必要はありません。マネージャーに保存されている1つのリスト/マップオブジェクトで作業しています。そして、データを変更した後は、adapter.notifyDataSetChanged()と呼ぶだけです。

は、この記事に私のコードの例を確認してください: Unable to refresh listview data within same fragments used under different tabs

+0

私はよく分かりません。あなたは私にもっと詳しく説明できますか?私は2つのアクティビティを持っています。最初はリストビューを含み、2番目のアクティビティを開始します。2番目のアクティビティでは、最初のアクティビティのリストビューに含まれる新しいアイテムを保存します。 – garciam202

+0

現在、リストビューのデータを 'parceableExtra'で2番目のアクティビティに渡します。今度は2番目のアクティビティに、この渡されたアイテムのコピーがあります。新しい項目をコピーに設定します。最後に、新しいアダプターを設定します。私のソリューションでは、コピーを扱うことはできません。オブジェクトを格納するマネージャがあります。もうコピーはありません。 'setAdapter()'を何度も呼び出す必要はありません。あなたは常に同じリストで作業します。最後に、新しいアダプタを作成するのではなく、 'adapter.notifyDataSetChanged()'を呼び出さなければなりません。 – beeb

+0

はい。私はアダプタとマネージャの関係を理解し​​ていません。 2番目のアクティビティでは、notifyCallbacks()を呼び出すaddMovie(movie)を呼び出します。ここでループm_MovieChangedCallbacksはCDMBasicMovieFragmentのonMoviesChanged()を呼び出しますが、これは何ですか? CDMBasicMovieFragmentは私の最初の活動ですか? m_Moviesとm_MovieChangedCallbacksの違いは何ですか? 私の疑問を残して申し訳ありません – garciam202

0

あなたはただ一つのアクティビティを使用して、あなたの2つのビューのそれぞれのかけらを持っている可能性があります。アクティビティは、要素への参照を保持し、2つのフラグメント間の通信を処理します(like described here at the bottom)。

アクティビティに固執したい場合は、おそらくインテントが推奨されます。

+0

しかし、私はlistfragmentが新しいアクティビティを開始して、新しいアイテムでlistfragmentを更新する必要があります。どのように私は両方を伝えることができる? – garciam202

関連する問題