gpt4 book ai didi

android - 如何使用 Intent 传递对象列表?

转载 作者:行者123 更新时间:2023-11-29 14:46:47 26 4
gpt4 key购买 nike

如何将对象列表传递给另一个 Activity ?

我正在尝试这个但它不起作用......

Activity A

Intent i = new Intent(this,MainActivity.class);
i.putParcelableArrayListExtra("list",listCsv);
setResult(Activity.RESULT_OK,i);
finish();

Activity B

ArrayList<Contato> lAgenda = 
(ArrayList<Contato>) getIntent().getSerializableExtra("lista");

在我的 Activity B 中,我的列表 lAgenda 没有得到 Activity A 的列表,我得到了一个 NULL 值。

我的 ContatoVO 类(class)

public class ContatoVO implements Serializable,Parcelable{
private static final long serialVersionUID = 1L;
private long id;
private String nome;
private String endereco;
private String telefone;
private String estado;
private int idEstado;


public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public int getIdEstado()
{
return idEstado;
}

public void setIdEstado(int id)
{
this.idEstado = id;
}

public String getEstado() {
return estado;
}

public void setEstado(String estado) {
this.estado = estado;
}

public String getNome() {
return nome;
}

public void setNome(String value) {
this.nome = value;
}

public String getEndereco() {
return endereco;
}

public void setEndereco(String value) {
this.endereco = value;
}

public String getTelefone() {
return telefone;
}

public void setTelefone(String value) {
this.telefone = value;
}
// Will be used by the ArrayAdapter in the ListView
@Override
public String toString() {
return nome;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {

dest.writeString(nome);
dest.writeString(endereco);
dest.writeString(telefone);
}

}

向Activity发送数据intent的函数

public final void lerCsv(Context context)
{

AssetManager assetManager = context.getAssets();
ArrayList<ContatoVO> listaCsv = new ArrayList<ContatoVO>();

try
{
InputStream iStream = assetManager.open("teste.csv");
InputStreamReader iStreamReader = new InputStreamReader(iStream);
CSVReader csvReader = new CSVReader(iStreamReader,';');

String[] registro = null;

//pula cabeçalho
csvReader.readNext();

while((registro = csvReader.readNext()) != null)
{

ContatoVO contato = new ContatoVO();
contato.setNome(registro[0]);
contato.setEndereco(registro[1]);
contato.setTelefone(registro[2]);

listaCsv.add(contato);

}

csvReader.close();

Intent i = new Intent(this,MainActivity.class);

i.putParcelableArrayListExtra("lista",listaCsv);
setResult(Activity.RESULT_OK,i);
finish();
}
catch(IOException ex)
{
ex.printStackTrace();
}

}

我在哪里尝试获取此数据(列表)

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
ArrayList<ContatoVO> lAgendaVO = null;
try {
super.onActivityResult(requestCode, resultCode, data);

lAgendaVO = data.getParcelableArrayListExtra("lista");

lContatoDAO.open();
lContatoDAO.InserirListaCsv(lAgendaVO);
adapter.notifyDataSetChanged();


} catch (Exception ex) {
trace("Erro : " + ex.getMessage());
}
}

最佳答案

您用于检索 ArrayList 的 key 与您用于将其写入包的 key 不匹配。你必须保持一致。使用 listlista。我强烈建议你使用常量。例如

Activity A

public static final String LIST_KEY = "LIST_KEY";
Intent i = new Intent(this,MainActivity.class);
i.putParcelableArrayListExtra(LIST_KEY,listCsv);
setResult(Activity.RESULT_OK,i);
finish();

Activity B

ArrayList<Contato> lAgenda = 
(ArrayList<Contato>) getIntent(). getParcelableArrayList(ActivityA.LIST_KEY);

如果检索 List 的代码 fragment 是 onActivityResult 的一部分,则必须使用前一个参数 Intent data 而不是 getIntent()

正如@Sergey 所指出的,您还必须在使用的 put*/get* 上保持一致。如果 ContatoParcelable(强烈推荐),请使用 getParcelableArrayList 而不是 getSerializableExtra

编辑:

你需要一个接受 Parcel

的构造函数
protected ContatoVO(Parcel in) {
id = in.readLong();
nome = in.readString();
endereco = in.readString();
telefone = in.readString();
estado = in.readString();
idEstado = in.readInt();
}

您 writeToParcel 并没有写入所有字段。将其更改为:

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(id);
dest.writeString(nome);
dest.writeString(endereco);
dest.writeString(telefone);
dest.writeString(estado);
dest.writeInt(idEstado);
}

而您错过了 Parcelable.Creator

@SuppressWarnings("unused")
public static final Parcelable.Creator<ContatoVO> CREATOR = new Parcelable.Creator<ContatoVO>() {
@Override
public ContatoVO createFromParcel(Parcel in) {
return new ContatoVO(in);
}

@Override
public ContatoVO[] newArray(int size) {
return new ContatoVO[size];
}
};

关于android - 如何使用 Intent 传递对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33152847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com