Android:添加到列表中的最后一个对象会覆盖所有其他对象

时间:2015-03-31 04:44:53

标签: java android list android-listview

我正在输入列表中的对象,并注意到最后添加的内容覆盖了列表中的所有其他对象,以下代码片段。

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
}

如何使用列表解决此问题?我希望不需要因为其中一个原因而改变收藏品。我读了另一个问题,可能的问题可能是“静态字段”,但在我的代码中没有任何静态字段。

3 个答案:

答案 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();
                    }

希望这会对你有帮助..