Android 将动态项添加到listview

Android 将动态项添加到listview,android,listview,Android,Listview,我需要将项目动态添加到listview 现在,我使用FAB(crearEntrenamintoActivity)打开一个新活动(CreareJerciIOActivity),并在这里完成新项目的必要数据以添加到listview中 但通过这种方式,我需要在两个活动之间始终传递parceableExtra 还有其他更简单的方法吗 编辑: 在这里,当我按下FAB按钮时,我会向新活动发送额外的“Enternamiento”,因为我需要将listview的所有项目保存到此对象中 public void i

我需要将项目动态添加到listview

现在,我使用FAB(crearEntrenamintoActivity)打开一个新活动(CreareJerciIOActivity),并在这里完成新项目的必要数据以添加到listview中

但通过这种方式,我需要在两个活动之间始终传递parceableExtra

还有其他更简单的方法吗

编辑:

在这里,当我按下FAB按钮时,我会向新活动发送额外的“Enternamiento”,因为我需要将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);
                }
            });
        }
    }
然后在“CreareJercciioActivity”中我有这个。在这里,当我按下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);
            }
        }
if(enternamiento.getEjercicios().size()>0){
ListView ListViewejbicios=(ListView)findViewById(R.id.ListViewejbicios);
ArrayList titulosEjercicios=新的ArrayList();
for(Ejercicio Ejercicio:enternamiento.getEjercicios()){
titulosEjercicios.add(ejercicio.getitulo());
}
ArrayAdapter listAdapter=新的ArrayAdapter(这个,R.layout.simple\u row\u ejercicio\u布局,titulosEjercicios);
如果(listViewEjercicios!=null){
setAdapter(listAdapter);
}
}

您可以只使用一个活动,然后为两个视图中的每个视图创建片段。然后,活动可以保存对元素的引用,并通过调用两个片段()上的公共方法来处理它们之间的通信


如果您想坚持活动,那么意图可能是推荐的方法。

您可以只使用一个活动,然后为两个视图中的每一个视图创建片段。然后,活动可以保存对元素的引用,并通过调用两个片段()上的公共方法来处理它们之间的通信


如果你想坚持活动,意图可能是推荐的方法。

我推荐一个管理类,它是singleton。管理器应该包括数据结构,如列表或地图。您可以在那里保存对象。如果要添加新对象,请调用
manager.add(您的对象)
。此外,您还可以创建一个类似于通知回调的函数。每个使用管理器数据的视图都必须实现回调。使用
manager.registerCallback()
在管理器上注册视图。每次修改管理器的数据时,如
add()
remove()
都必须调用
notifyCallbacks()

如果实现我的解决方案,则不必创建多个适配器对象。您正在使用保存在管理器中的一个列表/地图对象。修改数据后,只需调用
adapter.notifyDataSetChanged()

查看我在这篇文章中的代码示例:

我推荐一个管理类,它是singleton。管理器应该包括数据结构,如列表或地图。您可以在那里保存对象。如果要添加新对象,请调用
manager.add(您的对象)
。此外,您还可以创建一个类似于通知回调的函数。每个使用管理器数据的视图都必须实现回调。使用
manager.registerCallback()
在管理器上注册视图。每次修改管理器的数据时,如
add()
remove()
都必须调用
notifyCallbacks()

如果实现我的解决方案,则不必创建多个适配器对象。您正在使用保存在管理器中的一个列表/地图对象。修改数据后,只需调用
adapter.notifyDataSetChanged()

查看我在这篇文章中的代码示例:

您能再解释一下吗,或者输入代码?是的,对不起。我编辑。你能再解释一点吗?或者把代码放进去?是的,对不起。我编辑。但是我需要listfragment启动新活动,然后用新项目更新listfragment。但是我需要listfragment启动新活动,然后用新项目更新listfragment。我怎样才能把两者都沟通呢?我不太懂。你能再给我解释一下吗?我有两个活动,第一个包含listview并启动第二个活动,在第二个活动中,我保存了一个新项目,该项目将包含在第一个活动的listview中。当前,您使用
parceableExtra
将listview的数据传递给第二个活动。现在,在您的第二个活动中,您有了此传递项的副本。将新项目设置为副本。最后设置一个新适配器。使用我的解决方案,您不需要使用副本。您有一个存储对象的管理器。已经没有副本了。您不必多次调用
setAdapter()
。您将始终使用相同的列表。最后,您只需调用
adapter.notifyDataSetChanged()
,而无需创建新适配器。是。但是我不理解适配器和管理器之间的关系。在第二个活动中,我调用addMovie(movie),它调用notifyCallbacks();循环m_MovieChangedCallbacks在CDMBasicMovieFragment中调用onMovieChanged(),但这是什么?电影片段应该是我的第一个活动吗?m_电影和m_电影更改回调有什么区别?对不起,我有点怀疑(没问题;)管理器存储的数据是
m\u Movies
。此外,它还存储管理器在数据更改时必须通知的所有回调(
m_MovieChangedCallbacks
CDMBasicMovieFragment
是实现回调的类。在您的情况下,您的活动必须实现回调。回调本身只包含一个名为
onMovieChanged()
的函数。别忘了向经理注册回调。调用
manager.registerCallback(this)
。示例代码用于电影。