【问题标题】:Multiple layouts recyclerView with data coming from firebase具有来自 firebase 的数据的多个布局 recyclerView
【发布时间】:2023-03-25 22:10:01
【问题描述】:

我正在尝试从 Firestore 获取数据并将它们添加到回收站视图中,我尝试这样做:

for (DocumentChange doc : queryDocumentSnapshots.getDocumentChanges()) {
    if (doc.getType() == DocumentChange.Type.ADDED) {

        Users users = doc.getDocument().toObject(Users.class);

        if (users.getName() != null) {                
            if(users.getStatus() == null){                    
                mUsersList.add(new Users(true));
                mUsersList.add(users);                    
            }

            mUsersList.add(users);
            usersListAdapter.notifyDataSetChanged();
        }
    }
}

我已经以正确的方式配置了一个适配器,但是当我尝试设置布尔标志时,这是显示一个布局所必需的,或者另一个:

java.lang.RuntimeException:无法反序列化对象。 com.example.gusta.client.list_model.Users 类没有定义无参数构造函数。如果您使用 ProGuard,请确保这些构造函数没有被剥离。

这是因为我需要一个空的构造函数,但是如果我在我的列表上设置一个空的构造函数,我将无法在布局之间进行选择。

如果您知道答案或知道可以帮助我解决此问题的视频课程,我将非常高兴,谢谢。

public class Users {

    String user,status,image,descricao;
    private Boolean adcionais;



        public Users(){

        }

        public Users(String name, String status,Boolean adcionais) {
            this.user = name;
            this.status = status;
            this.adcionais = adcionais;
        }

        public String getName() {
            return ;
        }

        public void setName(String name) {
            this.user = name;
        }

        public String getStatus() {
            return status;
        }

        public void setStatus(String status) {
            this.status = status;
        }

        public String getImage() {
            return image;
        }

        public void setImage(String image) {
            this.image = image;
        }

        public String getDescricao() {
            return descricao;
        }

        public void setDescricao(String descricao) {
            this.descricao = descricao;
        }


        public Boolean getAdcionais() {
            return adcionais;
        }

        public void setAdcionais(Boolean adcionais) {
            this.adcionais = adcionais;
        }
    }

【问题讨论】:

  • 我在下面给出了最可能的原因和解决方案。如果这不是问题,请编辑您的问题以包含您的 Users 课程。一般来说,我建议阅读how to create a minimal, complete, verifiable example 以获得关于如何使我们最有可能快速帮助您解决与代码相关的问题的重要建议。
  • 如果您尝试创建具有多个布局(ViewHolder)的 RecyclerView,那么这可能会对您有所帮助stackoverflow.com/questions/26245139/…

标签: android android-recyclerview google-cloud-firestore


【解决方案1】:

您需要使用默认值初始化变量。您可以在定义变量的位置初始化变量,也可以如下所示使用:

public class Users ... {
...
public Users() { 
    Users("","",false) // "" or null for String
  }
  ...
}

另外,将实现 Serializable 添加到您的模型中。

【讨论】:

    【解决方案2】:

    正如错误消息所述,您的 Users 类没有无参数构造函数,这是 Cloud Firestore SDK 能够从文档中的 JSON 数据创建类所必需的。

    要解决这个问题,请在您的类中添加一个无参数构造函数:

    public class Users ... {
        ...
        public Users() { }
        ...
    }
    

    【讨论】:

    • 嘿弗兰克,我编辑了我的问题并添加了 User 类,我有一个空的构造函数,但我需要用布尔值填充他以在 recyclerview 中设置不同的布局。
    • 您必须有一个空的构造函数,因为当您调用 toObject() 时,它需要为文档创建您的类的新实例时会调用该构造函数。您可以在无参数构造函数中设置布尔默认值。
    【解决方案3】:

    我使用了这个而不是布尔值:

            @Override
              public int getItemViewType(int position) {
    
            if(mUsersList.get(position).getStatus() ==null){
    
                    return CLASSE;
    
            }else {
    
                   return USER;
            }
    
        }
    
    }
    

    所以现在它可以工作了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 2016-07-19
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 2018-08-30
      • 2019-05-24
      相关资源
      最近更新 更多