【问题标题】:Retrieve users followers list检索用户关注者列表
【发布时间】:2018-10-24 12:52:04
【问题描述】:

我正在尝试从 Firebase 检索用户关注者并将它们填充到 RecyclerView 上,以便任何人都能看到,就像 twitter 和 Instagram 一样,当我运行应用程序时它返回一个错误。

我的代码:

公共类 ViewFollowersFragment 扩展片段 { private static final String TAG = "ViewFollowersFragment";

private CircleImageView myprofileimage;
private TextView username;
private ImageView arrow;
private ListView vfollowerslistview;
private DatabaseReference viewFollowersref,viewUserRef;
private FirebaseAuth mAuth;
private FirebaseListAdapter viewfollowersadapter;
private List<User> mUserList;
private User mUser;
String userid;

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_view_followers, container, false);

    Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);

    vfollowerslistview = (ListView) view.findViewById(R.id.viewfollowerslistview);


    arrow = (ImageView) view.findViewById(R.id.fragfollowersbackarrow);
    arrow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            getActivity().getSupportFragmentManager().popBackStack();
            getActivity().finish();
        }
    });

    mUserList = new ArrayList<>();
    mAuth = FirebaseAuth.getInstance();
    userid = mAuth.getUid();
    viewFollowersref = FirebaseDatabase.getInstance().getReference().child("User_Account_Settings");

    viewUserRef = FirebaseDatabase.getInstance().getReference();

   setFollowers();


    return view;
}


private void setFollowers () {

    Query query = FirebaseDatabase.getInstance().getReference()
            .child("Followers")
            .child(mUser.getUser_id());
    FirebaseListOptions<UserAccountSettings> options = new FirebaseListOptions.Builder<UserAccountSettings>()
            .setLayout(R.layout.layout_user_listitem)
            .setLifecycleOwner(getActivity())
            .setQuery(query,UserAccountSettings.class)
            .build();
    viewfollowersadapter = new FirebaseListAdapter(options) {
        @Override
        protected void populateView(View v, Object model, final int position) {

            String newfol = getRef(position).getKey();
            final TextView username = v.findViewById(R.id.username);
            final CircleImageView profile_image = v.findViewById(R.id.profile_image);


            viewFollowersref.child(newfol).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    if (dataSnapshot.exists()) {
                        if (dataSnapshot.hasChild("username")) {
                            String myusername = dataSnapshot.child("username").getValue().toString();
                            username.setText(myusername);
                        }
                        if (dataSnapshot.hasChild("profileimage")) {
                            String myimage = dataSnapshot.child("profileimage").getValue().toString();

                            if (myimage.isEmpty()) {
                                profile_image.setImageResource(R.drawable.pro_pic);
                            } else {
                                Picasso.with(getActivity()).load(myimage).placeholder(R.drawable.pro_pic).into(profile_image);
                            }

                        }
                    }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });


            username.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent profileIntent = new Intent(getActivity(), ProfileActivity.class);
                    profileIntent.putExtra("calling_activity", "Search_Activity");
                    profileIntent.putExtra("intent_user", mUserList.get(position));
                    startActivity(profileIntent);

                }
            });

            profile_image.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent profileIntent = new Intent(getActivity(), ProfileActivity.class);
                    profileIntent.putExtra("calling_activity", "Search_Activity");
                    profileIntent.putExtra("intent_user", mUserList.get(position));
                    startActivity(profileIntent);

                }
            });

            Query userQuery = viewUserRef
                    .child("Users")
                    .orderByChild("user_id");
            userQuery.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
                        Log.d(TAG, "onDataChange: found user: " +
                                singleSnapshot.getValue(User.class).getUsername());

                        mUserList.add(singleSnapshot.getValue(User.class));
                    }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }

    };
    vfollowerslistview.setAdapter(viewfollowersadapter);

}
}

我似乎无法将整个代码放入其中。

【问题讨论】:

  • 如果应用程序崩溃,会有一个堆栈跟踪。请在 logcat 上查找,并将其添加到您的问题中。
  • 这是错误 ir 返回原因:java.langCaused by:java.lang.NullPointerException:尝试调用虚拟方法'java.lang.String com.example.hope.myapplication.Models.User。 getUser_id()' 在 com.example.hope.myapplication.Utils.ViewFollowersFragment.setFollowers(ViewFollowersFragment.java:100) 在 com.example.hope.myapplication.Utils.ViewFollowersFragment.onCreateView(ViewFollowersFragment.java:89) 的空对象引用上的 getUser_id()' )

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


【解决方案1】:

根据您的评论,您收到以下错误:

引起:java.lang引起:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String com.example.hope.myapplication.Models.User.getUser_id()”

因为您正在调用getUser_id() 方法的mUser 对象具有null 的值。发生这种情况是因为您根本没有在代码中初始化 User 对象。要解决这个问题,请更改以下代码行:

Query query = FirebaseDatabase.getInstance().getReference()
        .child("Followers")
        .child(mUser.getUser_id());

Query query = FirebaseDatabase.getInstance().getReference()
        .child("Followers")
        .child(mAuth.getCurrentUser().getUid());

其中mAuth.getCurrentUser()返回一个FirebaseUser对象,这样就可以得到正确的uid

【讨论】:

  • 你给我的代码显示了当前用户的关注者。我想显示用户的关注者。我想显示特定用户的关注者。
  • 没错。在这种情况下,您应该使用要显示的用户的 uid 而不是 mAuth.getCurrentUser().getUid(),对吧?
  • 我认为通过强调“具体”会让人感到困惑。我的意思是任何用户。能够看到任何用户的关注者
  • 是的,而不是mAuth.getCurrentUser().getUid(),这是当前登录用户的id,你应该使用任何用户的任何其他uid。要获取该 uid,请将该 uid 存储在每个用户对象下以便能够使用它,对吗?
  • 我已经在我的一个 tutorials 中解释了如何实现这一目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 2018-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
相关资源
最近更新 更多