我正在输入列表中的对象,并注意到最后添加的内容覆盖了列表中的所有其他对象,以下代码片段。
private List<NoticiaListView> getNoticias() {
try {
List<Noticia> lNoticiaParseObject = null;
List<NoticiaListView> lNoticiaListView = new ArrayList<NoticiaListView>();
NoticiaListView nListView = new NoticiaListView();
ParseQuery<Noticia> query = ParseQuery.getQuery(Noticia.class);
query.whereEqualTo("ativo", true);
query.include("imagem");
lNoticiaParseObject = query.fromLocalDatastore().find();
if (!lNoticiaParseObject.isEmpty()) {
for (Noticia noticia : lNoticiaParseObject) {
nListView.setImagem(noticia.getImagemByteArray((Midia) noticia.getParseObject("imagem")));
nListView.setTitulo(noticia.getTitulo());
nListView.setConteudo(noticia.getConteudo());
nListView.setLink(noticia.getLink());
nListView.setCreatedAt(noticia.getCreatedAt().getTime());
lNoticiaListView.add(nListView);
}
return lNoticiaListView;
}
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
classe NoticiaListView:
public class NoticiaListView {
private String titulo;
private String conteudo;
private String link;
private long createdAt;
private byte[] imagemBytes;
public NoticiaListView() {
/*this.titulo = titulo;
this.conteudo = conteudo;
this.link = link;
this.createdAt = createdAt;
this.imagemBytes = imagemBytes;*/
}
//region GETTERS
public String getTitulo() {
return titulo;
}
public String getConteudo() {
return conteudo;
}
public String getLink() {
return link;
}
public long getCreatedAt() {
return createdAt;
}
public byte[] getImagem() {
return imagemBytes;
}
//endregion
//region SETTERS
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public void setConteudo(String conteudo) {
this.conteudo = conteudo;
}
public void setLink(String link) {
this.link = link;
}
public void setCreatedAt(long createdAt) {
this.createdAt = createdAt;
}
public void setImagem(byte[] imagem) {
this.imagemBytes = imagem;
}
//endregion
}
Class Noticia:
public class Noticia extends ParseObject {
public Noticia() {
/*deixar vazio*/
}
//region GETTERS
public ParseACL getParseACL(){
return getParseACL();
}
/*public String getObjectId() {
return getObjectId();
}*/
/*public Date getCreatedAt() {
return getCreatedAt();
}*/
/* public Date getUpdatedAt() {
return getUpdatedAt();
}*/
public boolean isAtivo() {
return getBoolean("ativo");
}
public String getConteudo() {
return getString("conteudo");
}
public String getLink() {
return getString("link");
}
public String getTitulo() {
return getString("titulo");
}
public byte[] getImagemByteArray(Midia midia) {
byte[] imageData = new byte[0];
try {
imageData = midia.getParseFile("arquivo").getData();
} catch (ParseException e) {
e.printStackTrace();
}
return imageData;
}
//endregion
//region SETTERS
public void setACL(ParseACL acl){
put("ACL", acl);
}
public void setCreatedAt(Date createdAt) {
put("createdAt", createdAt);
}
public void setUpdatedAt(Date updatedAt) {
put("updatedAt", updatedAt);
}
public void setAtivo(boolean ativo) {
put("ativo", ativo);
}
public void setConteudo(String conteudo) {
put("conteudo", conteudo);
}
public void setLink(String link) {
put("link", link);
}
public void setTitulo(String titulo) {
put("titulo", titulo);
}
public void setImagem(ParseRelation<Midia> imagem) {
put("imagem", imagem);
}
//endregion
}
如何使用列表解决此问题?我希望不需要因为其中一个原因而改变收藏品。我读了另一个问题,可能的问题可能是“静态字段”,但在我的代码中没有任何静态字段。
答案 0 :(得分:3)
请更改您的代码,如下所示。因为你刚刚创建了一次对象,它应该多次创建,具体取决于你的列表大小。你应该在for循环中创建对象。
private List<NoticiaListView> getNoticias() {
try {
List<Noticia> lNoticiaParseObject = null;
List<NoticiaListView> lNoticiaListView = new ArrayList<NoticiaListView>();
ParseQuery<Noticia> query = ParseQuery.getQuery(Noticia.class);
query.whereEqualTo("ativo", true);
query.include("imagem");
lNoticiaParseObject = query.fromLocalDatastore().find();
if (!lNoticiaParseObject.isEmpty()) {
for (Noticia noticia : lNoticiaParseObject) {
NoticiaListView nListView = new NoticiaListView();/// change here.
nListView.setImagem(noticia.getImagemByteArray((Midia) noticia.getParseObject("imagem")));
nListView.setTitulo(noticia.getTitulo());
nListView.setConteudo(noticia.getConteudo());
nListView.setLink(noticia.getLink());
nListView.setCreatedAt(noticia.getCreatedAt().getTime());
lNoticiaListView.add(nListView);
}
return lNoticiaListView;
}
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
答案 1 :(得分:2)
Android:添加到列表中的最后一个对象会覆盖所有其他对象
在nListView
循环内创建NoticiaListView
类的for-each
对象,以在ArrayList中添加新对象:
for (Noticia noticia : lNoticiaParseObject) {
// create object here
NoticiaListView nListView = new NoticiaListView();
// ... your code here..
lNoticiaListView.add(nListView);
}
答案 2 :(得分:1)
重新初始化对象nListView
for (Noticia noticia : lNoticiaParseObject) {
nListView.setImagem(noticia.getImagemByteArray((Midia) noticia.getParseObject("imagem")));
nListView.setTitulo(noticia.getTitulo());
nListView.setConteudo(noticia.getConteudo());
nListView.setLink(noticia.getLink());
nListView.setCreatedAt(noticia.getCreatedAt().getTime());
lNoticiaListView.add(nListView);
nListView = new NoticiaListView();
}
希望这会对你有帮助..