【问题标题】:Cannot receive Strings from Android Firebase Database无法从 Android Firebase 数据库接收字符串
【发布时间】:2018-05-19 16:35:43
【问题描述】:

我想从我的 firebase 数据库中获取名称(字符串)和位置(字符串)到我的应用程序片段页面的列表视图中。它没有给出任何错误,但名称和位置文本只是不出现在应用程序上。感谢帮助。我认为从 firebase 服务器获取字符串存在问题。

Firebase hierarchy : FIREBASE -> Events -> XmasParty -> location = Germany
                                                     -> name = XmasParty

片段:

public class RequestsFragment extends Fragment {


    private Button create_event_btn;
    private View mMainView2;
    private RecyclerView mEventList;
    private DatabaseReference mEventsDatabase;
    private LinearLayoutManager mLayoutManager;


    public void ChatsFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        mMainView2 = inflater.inflate(R.layout.fragment_requests, container, false);
        mEventsDatabase = FirebaseDatabase.getInstance().getReference().child("Events");

        mLayoutManager = new LinearLayoutManager(getContext());
        create_event_btn = (Button) mMainView2.findViewById(R.id.create_btn);
        mEventList = (RecyclerView) mMainView2.findViewById(R.id.event_list);
        mEventList.setHasFixedSize(true);
        mEventList.setLayoutManager(mLayoutManager);



        create_event_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getActivity(), Create_EventActivity.class);
                startActivity(intent);
            }
        });


        // Inflate the layout for this fragment
        return mMainView2;
    }

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

        FirebaseRecyclerAdapter<Events, RequestsFragment.EventsViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Events, EventsViewHolder>(

                Events.class,
                R.layout.users_single_layout,
                RequestsFragment.EventsViewHolder.class,
                mEventsDatabase

        ) {
            @Override
            protected void populateViewHolder(RequestsFragment.EventsViewHolder eventsViewHolder, Events events, int position) {

                eventsViewHolder.setDisplayName(events.getName());
                eventsViewHolder.setUserStatus(events.getLocation());
               // usersViewHolder.setUserImage(users.getThumb_image(), getApplicationContext());

                final String event_id = getRef(position).getKey();

                eventsViewHolder.mView2.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

                        //Intent profileIntent = new Intent(UsersActivity.this, ProfileActivity.class);
                       // profileIntent.putExtra("user_id", user_id);
                       // startActivity(profileIntent);

                    }
                });

            }
        };


        mEventList.setAdapter(firebaseRecyclerAdapter);

    }


    public static class EventsViewHolder extends RecyclerView.ViewHolder {

        View mView2;

        public EventsViewHolder(View itemView2) {
            super(itemView2);

            mView2 = itemView2;

        }

        public void setDisplayName(String name){

            TextView userNameView = (TextView) mView2.findViewById(R.id.user_single_name);
            userNameView.setText(name);

        }

        public void setUserStatus(String status){

            TextView userStatusView = (TextView) mView2.findViewById(R.id.user_single_status);
            userStatusView.setText(status);


        }    

        }
    }
}

事件类

public class Events {

    public String name;
    public String location;
    public String time;



    public Events(){

    }

    public Events(String name, String location, String time) {
        this.name = name;
        this.location = location;
        this.time = time;
    }

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

    public String getLocation() {
        return location;
    }
    public void setLocation(String location) {
        this.location = location;
    }

    public String getTime() {return time;}
    public void setTime(String time) {this.time = time;}

}

【问题讨论】:

    标签: android listview firebase android-fragments firebase-realtime-database


    【解决方案1】:

    要获取locationname的值,请使用以下代码:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference yourRef = rootRef.child("Events").child("XmasParty");
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String location = dataSnapshot.child("location").getValue(String.class);
            String name = dataSnapshot.child("name").getValue(String.class);
            Log.d("TAG", location + " / " + name);
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    yourRef.addListenerForSingleValueEvent(eventListener);
    

    输出将是:

    Germany / XmasParty
    

    【讨论】:

    • 谢谢,还有一个问题:在我的情况下,“事件”根下有更多孩子,并且名称不同(例如:XmasParty with childs name = XmasParty /location = Germany AND some more like BirthdayParty名称 = 生日派对 / 位置 = 法国,还有一些类似的......)那么我怎样才能在事件下获得所有可变的孩子,而不仅仅是 XmasParty
    • 要获取Events节点下的所有对象,您需要在Events节点上附加一个侦听器并以与上述相同的方式进行迭代,但不要使用getValue()方法,您需要使用getKey() 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多