【问题标题】:Android: last object added to the list overrides all othersAndroid:添加到列表中的最后一个对象覆盖所有其他对象
【发布时间】:2015-03-31 04:44:53
【问题描述】:

我正在输入列表中的对象,并注意到最后添加的对象覆盖了列表中的所有其他对象,代码如下:sn-ps。

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;
    }

类 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
}

课堂通知:

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
}

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

【问题讨论】:

    标签: java android list android-listview


    【解决方案1】:

    请更改您的代码如下。因为您刚刚创建了一次对象,并且应该根据您的列表大小创建多次。你应该在 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;
    }
    

    【讨论】:

      【解决方案2】:

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

      for-each循环内创建NoticiaListView类的nListView对象以在ArrayList中添加新对象:

       for (Noticia noticia : lNoticiaParseObject) {
           // create object here
           NoticiaListView nListView = new NoticiaListView(); 
           // ... your code here..      
           lNoticiaListView.add(nListView);
         }
      

      【讨论】:

        【解决方案3】:

        重新初始化对象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();
                            }
        

        希望对你有所帮助..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-26
          • 2021-02-05
          • 2015-06-25
          • 1970-01-01
          • 2011-05-24
          • 2016-05-08
          • 1970-01-01
          • 2019-07-10
          相关资源
          最近更新 更多