【问题标题】:Android Firebase retrieve data from all nodes (nested) in FragmentsAndroid Firebase 从 Fragments 中的所有节点(嵌套)检索数据
【发布时间】:2017-11-29 23:33:56
【问题描述】:

我希望我的应用通过 2 种方式检索 Firebase 数据:

  1. 检索当前登录用户的数据,我使用 .child(user.getUid()), user = firebaseAuth.getCurrentUser() 完成此操作

  2. 从包括登录用户在内的所有用户中检索数据(因此提出了这个问题)。

    https://i.stack.imgur.com/WnwQg.png

换句话说,我想检索所有被圈出的数据值。

以下是我的代码:

AdminFragment.java:

public class AdminFragment extends Fragment {

    public AdminFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        super.onCreate(savedInstanceState);
        View view = inflater.inflate(R.layout.fragment_admin, container, false);

        final DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference().child("users");
        FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
        final FirebaseUser user = firebaseAuth.getCurrentUser();
        final RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerAdmin);
        recyclerView.setHasFixedSize(true);
        final LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
        mLayoutManager.setReverseLayout(true);
        mLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(mLayoutManager);
        final FirebaseRecyclerAdapter<Blog,BlogViewHolder> recyclerAdapter=new FirebaseRecyclerAdapter<Blog,BlogViewHolder>(
            Blog.class,
            R.layout.admin_row,
            BlogViewHolder.class,
            mDatabase
        ) {
            @Override
            protected void populateViewHolder(BlogViewHolder viewHolder, Blog model, int position) {
                viewHolder.setStatus(model.getStatus());
                viewHolder.setPerson(model.getPerson());
                viewHolder.setRequest(model.getRequest());
                viewHolder.setType(model.getType());
                viewHolder.setStart(model.getStart());
                viewHolder.setEnd(model.getEnd());
                viewHolder.setReason(model.getReason());
            }
        };
        recyclerAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver(){
            @Override
            public void onItemRangeInserted(int positionStart, int itemCount){
            super.onItemRangeInserted(positionStart, itemCount);
                int newsCount = recyclerAdapter.getItemCount();
                int lastVisiblePosition = mLayoutManager.findLastVisibleItemPosition();
                if(lastVisiblePosition == -1 || (positionStart>= (newsCount -1) && lastVisiblePosition == (positionStart -1))){
                    recyclerView.scrollToPosition(positionStart);
                }
            }
        });
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setAdapter(recyclerAdapter);
        return view;
    }
    private static class BlogViewHolder extends RecyclerView.ViewHolder {
        View mView;
        TextView statusTV, personTV, requestTV, typeTV, startTV, endTV, reasonTV;
        public BlogViewHolder(View itemView) {
            super(itemView);
            mView=itemView;
            statusTV = (TextView) itemView.findViewById(R.id.status);
            personTV = (TextView) itemView.findViewById(R.id.person);
            requestTV = (TextView) itemView.findViewById(R.id.request);
            typeTV = (TextView) itemView.findViewById(R.id.type);
            startTV = (TextView) itemView.findViewById(R.id.start);
            endTV = (TextView) itemView.findViewById(R.id.end);
            reasonTV = (TextView) itemView.findViewById(R.id.reason);
        }
        public void setRequest(String request) {
        requestTV.setText(request);
        }

        void setStatus(String status){
            statusTV.setText(status);
        }

        void setPerson(String person) {
            personTV.setText(person);
        }

        void setType(String type) {
            typeTV.setText(type);
        }

        void setStart(String start) {
            startTV.setText(start);
        }

        void setEnd(String end) {
            endTV.setText(end);
        }

        void setReason(String reason) {
            reasonTV.setText(reason);
        }
    }

}

博客.java:

public class Blog {
    private String status, person, request, type, start, end, reason, uid;
    public Blog() {
    }
    public Blog(String status, String person, String request, String type, String start, String end, String reason, String uid) {
        this.status = status;
        this.person = person;
        this.request = request;
        this.type = type;
        this.start = start;
        this.end = end;
        this.reason = reason;
        this.uid = uid;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public String getPerson() {
        return person;
    }
    public void setPerson(String person) {
        this.person = person;
    }
    public String getRequest() {
        return request;
    }
    public void setRequest(String request) {
        this.request = request;
    }
    public String getType() { return type; }
    public void setType(String type) { this.type = type; }
    public String getStart() { return start; }
    public void setStart(String start) { this.start = start; }
    public String getEnd() { return end; }
    public void setEnd(String end) { this.end = end; }
    public String getReason() { return reason; }
    public void setReason(String reason) { this.reason = reason; }
    public String getUid() { return uid; }
    public void setUid(String uid) { this.reason = uid; }
}

【问题讨论】:

    标签: android firebase firebase-realtime-database firebase-authentication firebaseui


    【解决方案1】:

    你好,你可以做这样的事情:

    Databaseref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot shot : dataSnapshot.getChildren()) {
                }
            }
    });
    

    dataSnapshot.getChildren() 的每个元素都是节点上的用户,其键为 uid。

    【讨论】:

    • 感谢您的回答。我可以知道我应该在哪里编写该代码吗?我试过了,但有一些错误。另外,这是否意味着我需要手动输入用户 uid?如果我有很多用户,是否可行?
    • 该函数正在通过 DatabaseReference 更改 Databaseref,这是您观察者的另一个选项。 ¿ 为什么要使用观察者?
    • 哦,那只是重新排列recyclerview中的数据顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    相关资源
    最近更新 更多