【问题标题】:Android: reading a value from a child with FirebaseUIAndroid:使用 FirebaseUI 从孩子那里读取值
【发布时间】:2018-06-01 00:34:05
【问题描述】:

我正在使用 FirebaseUI 从我的实时数据库中获取一些值到 Firebase RecyclerView。所以.. 我的数据看起来像这样:

users:
      userid:
            info:
                 Name:Muhammad

我不知道如何获取 Name 的值,这意味着我应该在 Users 类中具体做什么?这是我的代码(我认为问题出在班级用户中,我只是不知道如何访问孩子信息)

public class User {
    private String name;
    private String email;
    private String state;
    private String image;
    private String thumbnail;

    public User(String name, String state, String image) {
        this.name = name;
        this.state = state;
        this.image = image;
    }

    public User() {
    }

    public String getName() {
        return name;
    }

    public String getState() {
        return state;
    }

    public String getImage() {
        return image;
    }
}

我的主要活动 myDB 引用和 on start 方法(在 SUPERCILEX 注释后更新)

mDb = FirebaseDatabase.getInstance().getReference().child(App_Constants.USERS_COLUMN);



 @Override
    protected void onStart() {
        super.onStart();

        Query query = mDb;

        FirebaseRecyclerOptions<User> options = new FirebaseRecyclerOptions.Builder<User>()
                .setQuery(query, new SnapshotParser<User>() {
                    @NonNull
                    @Override
                    public User parseSnapshot(@NonNull DataSnapshot snapshot) {
                        String Name = snapshot.child(App_Constants.INFO_COLUMN).child(App_Constants.NAME_COLUMN).getValue().toString();
                        String State = snapshot.child(App_Constants.INFO_COLUMN).child(App_Constants.STATE_COLUMN).getValue().toString();
                        String Image = snapshot.child(App_Constants.INFO_COLUMN).child(App_Constants.IMAGE_COLUMN).getValue().toString();
                        User user = new User(Name,State,Image);

                        return user;
                    }
                }).build();

        FirebaseRecyclerAdapter<User,Users_ViewHolder> adapter = new FirebaseRecyclerAdapter<User, Users_ViewHolder>(options) {
            @NonNull
            @Override
            public Users_ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_user,parent,false);
                return new Users_ViewHolder(view);
            }

            @Override
            protected void onBindViewHolder(@NonNull Users_ViewHolder holder, int position, @NonNull User model) {

                holder.Set_Name(model.getName());
                holder.Set_Image(model.getImage());
                holder.Set_State(model.getState());
            }
        };
        mUsers.setAdapter(adapter);
    }

我的 ViewHolder

public class Users_ViewHolder extends RecyclerView.ViewHolder{

    View mView;
    public Users_ViewHolder(View itemView) {
        super(itemView);

        mView = itemView;
    }

    public void Set_Name(String Name)
    {
        TextView mName = mView.findViewById(R.id.tv_single_user_name);
        mName.setText(Name);
    }


    public void Set_Image(String url)
    {
        CircleImageView mImage = mView.findViewById(R.id.iv_single_user);
        Picasso.get().load(url).placeholder(R.drawable.profile).into(mImage);
    }


    public void Set_State(String State)
    {
        TextView mState = mView.findViewById(R.id.tv_single_user_state);
        mState.setText(State);
    }
}

谢谢

【问题讨论】:

  • This 是一种推荐的方式,您可以通过这种方式从 Firebase 实时数据库中检索数据并使用 FirebaseRecyclerAdapter 将其显示在 RecyclerView 中。
  • mohamed 当你调用getName() 方法时你会得到什么?
  • 感谢和抱歉迟到了...亚历克斯·马莫问题仍然在于我如何访问信息子项...数据在信息子项中我无法访问它...@eminem 它给了我字段数等于用户数,没错,但名称、状态和图像仍然为空,它无法访问它
  • @AlexMamo 对这个有什么想法吗? :stackoverflow.com/questions/56159855/…
  • @AngelaHeely 我去看看,如果我知道答案,我会写给你。

标签: android firebase firebaseui


【解决方案1】:

我相信它会以Map&lt;String, Object&gt; 的形式出现在球场info 上。但是,您始终可以使用自定义 SnapshotParser 来构建您喜欢的模型:https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md#using-the-firebaserecycleradapter

【讨论】:

  • 我做了文档中的操作,但仍然没有发生任何事情,但这次给了我一个空白页面(更新了帖子)
  • snapshot.child("info").child("Name").getValue() 应该可以工作。至于状态,您需要从根中删除它:snapshot.child("state").getValue()。确保您的大小写正确,因为 RTDB 区分大小写。
  • 谢谢你......由于这个原因,我使用了一个常量变量,并且我确信每件事都很好(区分大小写和字母),但问题是我无法访问信息字段。 ..
【解决方案2】:

一些建议:您介意更改设置方法名称吗? 从Set_StatesetState,我也有类似的问题,请尊重Java命名conventions

在您的自定义模型中添加设置方法

第二:

 FirebaseRecyclerOptions<User> options =
                new FirebaseRecyclerOptions.Builder<User>()
                        .setQuery(query, User.class)
                        .build();

开始收听:

@Override
protected void onStart() {
    super.onStart();
    adapter.startListening();
}

stopListening() 调用会移除事件监听器和适配器中的所有数据

@Override
protected void onStop() {
    super.onStop();
    adapter.stopListening();
}

Here你有一个很好的解释例子

【讨论】:

  • 谢谢 .. 我确实喜欢你所说的,但是当我这样做时 .setQuery(query, User.class) 它给了我这个 ..ibb.co/b6DmSd... 那是因为名字和状态和图像在信息字段而不是用户 ID 字段中.. 那么我如何访问信息字段
  • 最好的解决方案是删除info 我认为它是多余的,但是使用上面的模型会是:DatabaseReference keyRef = FirebaseDatabase.getInstance().getReference().child("userid").child(info);
猜你喜欢
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2014-11-18
相关资源
最近更新 更多