【问题标题】:How to hide current user from FirebaseRecyclerAdapter of all users? [duplicate]如何从所有用户的 FirebaseRecyclerAdapter 隐藏当前用户? [复制]
【发布时间】:2019-04-24 19:27:29
【问题描述】:

目前,它会提取所有用户的详细信息并填充他们的图片、姓名和简历。我希望它从用户列表中隐藏当前用户,我不知道如何实现它的代码。

我已尝试使用 if/while 语句将 dataSnapshot 与当前用户进行比较,但我不知道如何根据此条件填充用户。

public class SearchFragment extends Fragment {
    private RecyclerView usersList;
    private DatabaseReference databaseReference;
    private DatabaseReference userDatabase;
    private DatabaseReference checkName;
    private FirebaseAuth firebaseAuth;
    private String currentUserID;
    private View view;

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

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        view =  inflater.inflate(R.layout.fragment_search, container, false);
        usersList = view.findViewById(R.id.search_users);
        firebaseAuth = FirebaseAuth.getInstance();
        currentUserID = firebaseAuth.getCurrentUser().getUid();
        databaseReference = FirebaseDatabase.getInstance().getReference().child("Users");
        userDatabase = FirebaseDatabase.getInstance().getReference();
        checkName = userDatabase.child("Users").child(currentUserID).child("name");
        usersList.setHasFixedSize(true);
        usersList.setLayoutManager(new LinearLayoutManager(getContext()));

        return view;
    }

    @Override
    public void onStart() {
        super.onStart();
        final FirebaseRecyclerOptions<Users> options = new FirebaseRecyclerOptions.Builder<Users>()
                .setQuery(databaseReference, Users.class)
                .build();

        FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<Users, SearchFragment.UsersViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull SearchFragment.UsersViewHolder holder, int position, @NonNull final Users users) {
                 holder.setName(users.getName());
                 holder.setCity(users.getCity());
                 holder.setImage(users.getImage());

                final String user_ID = getRef(position).getKey();
                final String user_Name = users.getName();
                final String user_Img = users.getImage();

                holder.mView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        CharSequence pickOption[] = new CharSequence[]{"View Profile", "Send Message"};

                        final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                        builder.setTitle("Select an Option");
                        builder.setItems(pickOption, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialogInterface, int i) {
                                if (i == 0){
                                    Intent otherProfileIntent = new Intent(getActivity(), OthersProfileActivity.class);
                                    otherProfileIntent.putExtra("user_ID", user_ID);
                                    otherProfileIntent.putExtra("user_Name", user_Name);
                                    otherProfileIntent.putExtra("user_Img", user_Img);
                                    startActivity(otherProfileIntent);
                                }

                                if (i == 1) {
                                    Intent messageIntent = new Intent(getActivity(), MessageActivity.class);
                                    messageIntent.putExtra("user_ID", user_ID);
                                    messageIntent.putExtra("user_Name", user_Name);
                                    messageIntent.putExtra("user_Img", user_Img);
                                    startActivity(messageIntent);
                                }
                            }
                        });

                        builder.show();
                    }
                });
            }

            @NonNull
            @Override
            public SearchFragment.UsersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.users_layout, parent, false);
                return new SearchFragment.UsersViewHolder(view);
            }
        };

        usersList.setAdapter(adapter);
        adapter.startListening();
    }

    @Override
    public void onStop() {
        super.onStop();
    }

    public static class UsersViewHolder extends RecyclerView.ViewHolder {
        View mView;

        public UsersViewHolder(View itemView) {
            super(itemView);
            mView = itemView;
        }

        public void setName(String name) {
            TextView userNameView = mView.findViewById(R.id.single_userName);
            userNameView.setText(name);
        }

        public void setCity(String name) {
            TextView userNameView = mView.findViewById(R.id.single_userStatus);
            userNameView.setText(name);
        }

        public void setImage(String image) {
            CircleImageView userImage = mView.findViewById(R.id.single_userImg);
            if(!image.equals("default")) {
                Picasso.get().load(image).into(userImage);
            }
        }
    }
}

我希望当前用户从RecyclerView 中的所有用户列表中隐藏。提前致谢!

【问题讨论】:

  • 为了更好地理解,您希望获取存在于您的Users 节点中的所有用户,除了一个当前经过身份验证的用户,对吧?
  • 没错,我只需要显示除当前autenticated用户之外的所有其他用户。
  • 感谢 Alex 为我指明了正确的方向,我会努力实现它。

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


【解决方案1】:

您可以考虑修改您的databaseReference,如下所示。

databaseReference = FirebaseDatabase.getInstance().getReference().child("Users");
checkName = userDatabase.child("Users").child(currentUserID).child("name");

// This is your updated database reference
databaseReference = FirebaseDatabase.getInstance().getReference()
        .child("Users").child(currentUserID);

现在,在为您的 FirebaseRecyclerAdapter 设置选项时,您可以考虑设置如下查询。

final FirebaseRecyclerOptions<Users> options = new FirebaseRecyclerOptions.Builder<Users>()
    .setQuery(databaseReference.equalTo(null), Users.class)
    .build();

我没有测试过这个。但是,请让我知道这是否有效。

【讨论】:

  • 感谢您的快速回复,问题出在 holder.setName(user.getName());持有人.setCity(user.getCity()); holder.setImage(user.getImage());被调用时,它无法区分要填充的用户,我需要一个条件来说明不要用当前用户信息填充回收站视图,只填充其他用户。
  • 对不起,我没明白。我看到您的代码中有一个currentUserID,我想这是您要从RecyclerView 中排除的当前用户。因此,我建议修改数据库查询,以便它为您提供除currentUserID 之外的其他用户。请让我知道这是否有意义。
  • 出现此错误 类型不兼容。必需:com.google.firebase.database.DatabaseReference 找到:com.google.firebase.database.Query
  • 您现在可以尝试使用更新的代码吗?
  • 运气不好得到同样的错误,有没有办法从回收者视图中隐藏当前用户?
猜你喜欢
  • 1970-01-01
  • 2012-05-29
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
相关资源
最近更新 更多