2017-01-25 5 views
0

Мне нужно динамически добавлять элементы в listview.Добавить динамический элемент в listview

Теперь я использую функцию FAB (crearEntrenamintoActivity), чтобы открыть новое действие (crearEjercicioActivity), и здесь заполните необходимые данные нового элемента для добавления в список.

Но таким образом мне нужно передать parceableExtra все время между обоими действиями.

Есть ли еще более простой способ сделать это?

Edit:

Вот когда я нажимаю кнопку FAB я отправить к новой деятельности экстра «entrenamiento», потому что мне нужно, чтобы сохранить все пункты в ListView в этот объект.

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» у меня есть это. Здесь, когда я нажимаю кнопку сохранения, я добавляю в 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().

Если вы реализуете мое решение, вам не нужно создавать несколько объектов адаптера. Вы работаете с одним объектом списка/карты, который сохраняется в вашем менеджере. И после изменения данных вам просто нужно позвонить adapter.notifyDataSetChanged().

Проверьте мой пример кода на этом посту: Unable to refresh listview data within same fragments used under different tabs

+0

Я не очень хорошо понимаю. Можете ли вы объяснить мне больше? У меня есть два действия, первое содержит listview и запускает второе действие. Во втором действии я сохраняю новый элемент, который будет включен в список первого действия. – garciam202

+0

В настоящее время вы передаете данные списка с 'parceableExtra' во второе действие. Теперь в вашем втором действии у вас есть копия этого переданного элемента. Вы устанавливаете новый элемент в копию. Наконец, вы устанавливаете новый адаптер. С моим решением вы не работаете с копиями. У вас есть менеджер, который хранит объекты. Больше нет копий. Вам не нужно будет вызывать 'setAdapter()' несколько раз. Вы всегда будете работать с тем же списком. В конце вам нужно только вызвать «adapter.notifyDataSetChanged()» вместо создания нового адаптера. – beeb

+0

есть. но я не понимаю отношения между адаптером и менеджером. во втором действии я вызываю addMovie (фильм), который вызывает notifyCallbacks(); где цикл m_MovieChangedCallbacks вызывает onMoviesChanged() в CDMBasicMovieFragment, но что это? CDMBasicMovieFragment должен быть моей первой деятельностью? И в чем разница между m_Movies и m_MovieChangedCallbacks? Извините за мои сомнения – garciam202

0

Вы можете использовать только один активность и затем фрагменты для каждого из двух точек зрения. Затем активность может содержать ссылку на ваш элемент и обрабатывать связь между двумя фрагментами, вызывая на них общедоступные методы (like described here at the bottom).

Если вы хотите придерживаться видов деятельности, это, пожалуй, рекомендуемый подход.

+0

Но мне нужно, чтобы listfragment начал новую активность, а затем обновил listfragment с помощью нового элемента. Как я могу обмениваться обоими? – garciam202

Смежные вопросы