Android 保存自定义对象的ArrayList并向ArrayList添加新对象

Android 保存自定义对象的ArrayList并向ArrayList添加新对象,android,listview,parcelable,Android,Listview,Parcelable,在一个活动中保存自定义对象的ArrayList实例,然后在另一个活动中执行某些操作后重新引用它时,我遇到了一个问题。在第一个活动(具有ArrayList)中,有一个按钮用于启动第二个活动。在第二个活动中,要求用户创建一个新对象,该对象随后将添加到第一个活动的ArrayList中,这样,当第二个活动完成时,第一个活动将再次显示所有对象(包括最后创建的对象)的列表视图。我面临的问题是,ListView中只显示最后创建的对象 以下是第一个活动的代码: public class CargasMin ex

在一个活动中保存自定义对象的ArrayList实例,然后在另一个活动中执行某些操作后重新引用它时,我遇到了一个问题。在第一个活动(具有ArrayList)中,有一个按钮用于启动第二个活动。在第二个活动中,要求用户创建一个新对象,该对象随后将添加到第一个活动的ArrayList中,这样,当第二个活动完成时,第一个活动将再次显示所有对象(包括最后创建的对象)的列表视图。我面临的问题是,ListView中只显示最后创建的对象

以下是第一个活动的代码:

public class CargasMin extends AppCompatActivity implements View.OnClickListener {

RelativeLayout rl_CargasMin;

ImageButton bt_AdDep;
Button bt_CalcCargas;

ListView listView_Dep;

ArrayList<Dependencia> listaDeDependencias = new ArrayList<Dependencia>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.min_cargas);

    rl_CargasMin = (RelativeLayout) findViewById(R.id.cargasMinLayout);

    bt_AdDep = (ImageButton) findViewById(R.id.bt_AdDep_CargasMin);
    bt_CalcCargas = (Button) findViewById(R.id.bt_CalcCargas_CargasMin);
    bt_AdDep.setOnClickListener(this);
    bt_CalcCargas.setOnClickListener(this);

    // This seems not to be working!
    if(savedInstanceState == null) { }
    else {
        listaDeDependencias = savedInstanceState.getParcelableArrayList("key");
    }

    // Get last object created
    Intent intent_de_AdDep = getIntent();
    Dependencia dependenciaAAdicionar = (Dependencia) intent_de_AdDep.getParcelableExtra("novaDependencia");
    if(dependenciaAAdicionar == null) { }
    else {
        listaDeDependencias.add(dependenciaAAdicionar);
    }

    //Cria Adapter pra mostrar dependencias na ListView
    DependenciaAdapter adapterDeDependencias = new DependenciaAdapter(this, R.layout.adapter_dependencia, listaDeDependencias);

    //Seta Adapter
    listView_Dep = (ListView) findViewById(R.id.listView_Dep_CargasMin);
    listView_Dep.setAdapter(adapterDeDependencias);
}


@Override
public void onClick(View v) {
    switch(v.getId()) {
        case R.id.bt_AdDep_CargasMin:
            Intent intent_AdDep = new Intent(CargasMin.this, AdDep.class);
            startActivity(intent_AdDep);
            break;
        case R.id.bt_CalcCargas_CargasMin:
            //
            break;
    }
}


@Override
protected void onSaveInstanceState(Bundle outState) {
    // Aqui se salva a listaDeDependencias quando a Atividade eh momentaneamente fechada.
    outState.putParcelableArrayList("key", listaDeDependencias);
    super.onSaveInstanceState(outState);
    }
}
公共类CargasMin扩展AppCompative实现View.OnClickListener{
相对值rl_CargasMin;
图像按钮bt_addp;
按钮bt_CalcCargas;
列表视图列表视图_Dep;
ArrayList listaDeDependencias=新的ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.min_cargas);
rl_CargasMin=(RelativeLayout)findviewbyd(R.id.CargasMin布局);
bt_AdDep=(ImageButton)findViewById(R.id.bt_AdDep_CargasMin);
bt_CalcCargas=(按钮)findViewById(R.id.bt_CalcCargas_CargasMin);
bt_addp.setOnClickListener(本);
bt_CalcCargas.setOnClickListener(本);
//这似乎不起作用!
如果(savedInstanceState==null){}
否则{
listaDeDependencias=savedInstanceState.getParcelableArrayList(“键”);
}
//获取创建的最后一个对象
Intent Intent_de_AdDep=getIntent();
Dependencia dependenciaaadiaciator=(Dependencia)intent\u de_addp.getParcelableExtra(“novaDependencia”);
如果(dependenciaadicionar==null){}
否则{
listadependencias.add(dependenciaaadiaciator);
}
//Cria适配器pra mostrar从属项na列表视图
DependenciaAdapter adapter Dependencias=新的DependenciaAdapter(this,R.layout.adapter\u dependencia,listaDeDependencias);
//刚毛适配器
listView\u Dep=(listView)findViewById(R.id.listView\u Dep\u CargasMin);
listView_Dep.setAdapter(AdapterDependencias);
}
@凌驾
公共void onClick(视图v){
开关(v.getId()){
案例R.id.bt_AdDep_CargasMin:
Intent Intent_AdDep=新Intent(CargasMin.this,AdDep.class);
startActivity(意向书附录);
打破
案例R.id.bt_CalcCargas_CargasMin:
//
打破
}
}
@凌驾
SaveInstanceState上受保护的无效(束超出状态){
//这是一份关于死亡时间的清单。
outState.putParcelableArrayList(“键”,listaDeDependencias);
super.onSaveInstanceState(超出状态);
}
}
这是我的自定义类Dependencia的代码:

public class Dependencia implements Parcelable {
String nome;
int tipo;

float largura = 0;
float comprimento = 0;
float area = 0;
float perimetro = 0;

// Constructor da classe Dependencia.
public Dependencia(String nomeDep, int tipoDep) {
    nome = nomeDep;
    tipo = tipoDep;
}

private Dependencia(Parcel in) {
    nome = in.readString();
    tipo = in.readInt();
    largura = in.readFloat();
    comprimento = in.readFloat();
    area = in.readFloat();
    perimetro = in.readFloat();
}

public int describeContents() {
    return 0;
}

public void writeToParcel(Parcel out, int flags) {
    out.writeString(nome);
    out.writeInt(tipo);
    out.writeFloat(largura);
    out.writeFloat(comprimento);
    out.writeFloat(area);
    out.writeFloat(perimetro);
}

public static final Parcelable.Creator<Dependencia> CREATOR = new Parcelable.Creator<Dependencia>() {
    public Dependencia createFromParcel(Parcel in) {
        return new Dependencia(in);
    }

    public Dependencia[] newArray(int size) {
        return new Dependencia[size];
    }
};
}
公共类Dependencia实现可包裹{
字符串名称;
国际提波;
浮点数=0;
浮点压缩=0;
浮动面积=0;
浮动轨道=0;
//建造师是一名职业依赖者。
公共从属关系(字符串nomeDep,int tipoDep){
nome=nomeDep;
tipo=tipoDep;
}
私人眷属(包裹内){
nome=in.readString();
tipo=in.readInt();
largura=in.readFloat();
compremento=in.readFloat();
面积=in.readFloat();
perimetro=in.readFloat();
}
公共int描述内容(){
返回0;
}
公共无效写入包(包出,内部标志){
out.减记资本(nome);
外写(tipo);
out.writeFloat(largura);
out.writeFloat(compremento);
out.writeFloat(区域);
out.writeFloat(perimetro);
}
public static final Parcelable.Creator=新建Parcelable.Creator(){
公共依赖项createFromParcel(地块中){
返回新的受抚养人(in);
}
public Dependencia[]newArray(整数大小){
返回新的Dependencia[大小];
}
};
}
这是第二个活动的代码:

public class AdDep extends AppCompatActivity implements View.OnClickListener {

RelativeLayout rl_AdDep;

EditText et_Nome;
EditText et_Largura;
EditText et_Comprimento;
EditText et_Area;
EditText et_Perimetro;

Spinner spinner_Tipo;
String vetorTipo[];
int tipoEscolhido;

Button bt_AdDep1;
Button bt_AdDep2;

Dependencia novaDependencia;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.dep_ad);

    rl_AdDep = (RelativeLayout)findViewById(R.id.adDepLayout);

    et_Nome = (EditText) findViewById(R.id.et_Nome_AdDep);
    et_Largura = (EditText) findViewById(R.id.et_Largura_AdDep);
    et_Comprimento = (EditText) findViewById(R.id.et_Comprimento_AdDep);
    et_Area = (EditText) findViewById(R.id.et_Area_AdDep);
    et_Perimetro = (EditText) findViewById(R.id.et_Perimetro_AdDep);

    spinner_Tipo = (Spinner) findViewById(R.id.spinner_Tipo_AdDep);

    bt_AdDep1 = (Button) findViewById(R.id.bt_AdDep1);
    bt_AdDep2 = (Button) findViewById(R.id.bt_AdDep2);


    // Adicionando opcoes no spinner
    vetorTipo = new String[5];
    vetorTipo[0] = "Banheiro";
    vetorTipo[1] = "Varanda";
    vetorTipo[2] = "Cozinha/Copa/Serviço/etc.";
    vetorTipo[3] = "Sala/Dormitório";
    vetorTipo[4] = "Outro";

    // Criando ArrayAdapter de strings pro spinner
    ArrayAdapter<String> adapterTipo = new ArrayAdapter<String>(AdDep.this, android.R.layout.simple_spinner_item, vetorTipo);

    // Setando o Adapter
    spinner_Tipo.setAdapter(adapterTipo);

    // Valor default do spinner (hint)
    spinner_Tipo.setSelection(0);


    bt_AdDep1.setOnClickListener(this);
    bt_AdDep2.setOnClickListener(this);
}


@Override
public void onClick(View v) {
    if(String.valueOf(spinner_Tipo.getSelectedItem()).equals("Banheiro"))
        tipoEscolhido = 1;
    else if(String.valueOf(spinner_Tipo.getSelectedItem()).equals("Varanda"))
        tipoEscolhido = 2;
    else if(String.valueOf(spinner_Tipo.getSelectedItem()).equals("Cozinha/Copa/Serviço/etc."))
        tipoEscolhido = 3;
    else if(String.valueOf(spinner_Tipo.getSelectedItem()).equals("Sala/Dormitório"))
        tipoEscolhido = 4;
    else if(String.valueOf(spinner_Tipo.getSelectedItem()).equals("Outro"))
        tipoEscolhido = 5;

    novaDependencia = new Dependencia(et_Nome.getText().toString(), tipoEscolhido);

    switch(v.getId()) {
        case R.id.bt_AdDep1:
            novaDependencia.largura = Float.valueOf(et_Largura.getText().toString());
            novaDependencia.comprimento = Float.valueOf(et_Comprimento.getText().toString());
            break;
        case R.id.bt_AdDep2:
            novaDependencia.area = Float.valueOf(et_Area.getText().toString());
            novaDependencia.perimetro = Float.valueOf(et_Perimetro.getText().toString());
            break;
    }

    AlertDialog.Builder builder2 = new AlertDialog.Builder(v.getContext());
    builder2.setMessage("Deseja adicionar T.U.E. nesta dependência?").setPositiveButton("Sim", dialogClickListener).setNegativeButton("Não", dialogClickListener).show();
}

// Objeto tipo dialog criado para perguntar se usario deseja inserir TUEs
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        switch (which){
            case DialogInterface.BUTTON_POSITIVE:
                //Yes button clicked
                break;
            case DialogInterface.BUTTON_NEGATIVE:
                Intent intent_NovaDep_CargasMin = new Intent(AdDep.this, CargasMin.class);
                intent_NovaDep_CargasMin.putExtra("novaDependencia", novaDependencia);
                startActivity(intent_NovaDep_CargasMin);
                break;
        }
    }
};

}
public类AdDep扩展了AppCompatActivity实现了View.OnClickListener{
相对长度rl_加法;
编辑文本等;
EditText et_Largura;
编辑文本和综合文本;
编辑文本区;
EditText et_Perimetro;
纺纱机纺纱机;
字符串vetorTipo[];
蒂波斯科里多国际酒店;
按钮bt_AdDep1;
按钮bt_AdDep2;
新依亲属;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.dep_ad);
rl_AdDep=(RelativeLayout)findViewById(R.id.adDepLayout);
et_Nome=(EditText)findViewById(R.id.et_Nome_addap);
et_Largura=(编辑文本)findViewById(R.id.et_Largura_addap);
et_compremento=(EditText)findViewById(R.id.et_compremento_addap);
et_区域=(EditText)findViewById(R.id.et_区域添加);
et_Perimetro=(EditText)findViewById(R.id.et_Perimetro_addap);
微调器_Tipo=(微调器)findViewById(R.id.spinner_Tipo_addp);
bt_AdDep1=(按钮)findviewbyd(R.id.bt_AdDep1);
bt_AdDep2=(按钮)findviewbyd(R.id.bt_AdDep2);
//Adicionando opcoes无旋转器
vetorTipo=新字符串[5];
vetorTipo[0]=“Banheiro”;
维托蒂波[1]=“瓦兰达”;
vetorTipo[2]=“Cozinha/Copa/Serviço/etc.”;
vetorTipo[3]=“萨拉多米托里奥”;
vetorTipo[4]=“Outro”;
//Criando ArrayaAdapter de strings专业旋转器
ArrayAdapter adapterTipo=新的ArrayAdapter(addp.this,android.R.layout.simple\u spinner\u item,vetorTipo);
//Setando适配器
微调器设置适配器(适配器);
//Valor默认do微调器(提示)
旋转器(0);
bt_addp1.setOnClickListener(此);
bt_addp2.setOnClickListener(此);
}
@凌驾
公共void onClick(视图v){
if(String.valueOf(spinner_Tipo.getSelectedItem()).equals(“Banheiro”))
tipoEscolhido=1;
else if(String.valueOf(spinner_Tipo.getSelectedItem()).equals(“Varanda”))
tipoEscolhido=2;
else if(String.valueOf(spinner_Tipo.getSelectedItem()).equals(“Cozinha/Copa/Serviço/etc.”)
case R.id.bt_AdDep_CargasMin:
    Intent intent_AdDep = new Intent(CargasMin.this, AdDep.class);
    startActivityForResult(intent_AdDep, ADD_DEP_REQUEST);
    break;
public static final int ADD_DEP_REQUEST = 1;
case DialogInterface.BUTTON_NEGATIVE:
    Intent result = new Intent();
    result.putExtra("novaDependencia", novaDependencia);
    setResult(Activity.RESULT_OK, result);
    finish();
    break;
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode == ADD_DEP_REQUEST) {
         if (resultCode == RESULT_OK) {
             // Get last object created
             Dependencia dependenciaAAdicionar =
                         (Dependencia) data.getParcelableExtra("novaDependencia");
             if(dependenciaAAdicionar != null){
                 listaDeDependencias.add(dependenciaAAdicionar);
                 // Refresh Adapter pra mostrar dependenciaAAdicionar na ListView
                 adapterDeDependencias.notifyDataSetChanged();
             }
         }
     }
 }