首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Android RecycleView中隐藏一行

问在Android RecycleView中隐藏一行
EN

Stack Overflow用户
提问于 2020-11-05 20:07:28
回答 1查看 62关注 0票数 0

下面的图像是包含用户对象的JSON数据库。

我试图在RecycleView中隐藏一个特定的行。我目前能够在Firebase实时数据库中显示所有用户。我想添加一个约束,以隐藏当前登录用户的行。如果有人能帮我的话,我不知道如何隐藏具体的争吵。很多人在网上说这是不可能的。有人能帮帮我吗?

代码语言:javascript
复制
package com.example.bodify;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.bodify.Models.User;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;

public class ViewAllUsers extends AppCompatActivity{
    private RecyclerView rv;
    private FirebaseRecyclerOptions<User> userFirebaseRecyclerOptions;
    private FirebaseRecyclerAdapter<User,UserHolder> adapter;
    private FirebaseAuth mAuth = FirebaseAuth.getInstance();
    private FirebaseUser firebaseUser = mAuth.getCurrentUser();
    private ArrayList<User> users;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_all_users);
        getAllUsers();
        rv = findViewById(R.id.recyclerView);
        rv.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
        rv.setLayoutManager(linearLayoutManager);
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("User");
        userFirebaseRecyclerOptions = new FirebaseRecyclerOptions.Builder<User>().setQuery(ref,User.class).build();
        adapter = new FirebaseRecyclerAdapter<User,UserHolder>(userFirebaseRecyclerOptions) {

            @Override
            protected void onBindViewHolder(@NonNull UserHolder holder, int position, @NonNull User model) {
                //no matter what if I add a statement in here to avoid current user it will end up coming as a blank view
                holder.setUserName(model.getUserName());
                holder.setEmailAddress(model.getEmail());
                holder.setImage(model.getmImageUrl());
            }
            @NonNull
            @Override
            public UserHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.user_item,parent,false);
                return new UserHolder(view);
            }


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

    //steps
    //step 1. read all User Objects
    //Step 2. manually filter them
    //get a arraylist of all the users and simply remove the ones you dont want
    public void getAllUsers() {
        users = new ArrayList<>();
        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("User");
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot userSnapshot : snapshot.getChildren()) {
                    User user = userSnapshot.getValue(User.class);
                    users.add(user);
                    for (int i = 0; i < users.size(); i++) {
                        if (users.get(i).getEmail().equalsIgnoreCase(firebaseUser.getEmail())) {
                            users.remove(i);
                    }
                }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Toast.makeText(ViewAllUsers.this,"Error Occurred: " + error.getMessage(),Toast.LENGTH_SHORT).show();
            }
        });
    }


            @Override
    protected void onStart() {
        super.onStart();
        if(adapter != null) {
            adapter.startListening();
        }
    }
    @Override
    protected void onStop() {
        super.onStop();
        if(adapter != null) {
            adapter.stopListening();
            super.onStop();
        }
    }
    @Override
    protected void onResume() {
        super.onResume();
        if(adapter != null) {
            adapter.startListening();
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-06 14:08:39

在使用Firebase-UI库时,需要将查询对象传递给setQuery()方法。查看您的代码,我发现您传递的是一个简单的DatabaseReference对象,而不是一个查询。该对象实际上包含存在于“”节点下的所有用户对象。这意味着适配器将始终为每个用户创建一个视图。即使您在onBindViewHolder()方法中创建了一个if语句,它也会检查用户的电子邮件是否与已登录的用户的电子邮件相同,最终您将拥有一个空视图。

相反,您应该创建一个只生成您感兴趣的用户的查询。这意味着您必须向请求过滤器,并获取所有用户,其中一个除外。不幸的是,没有这样的否定(!=)查询。Firebase无法执行此筛选。所以,FirebaseRecyclerAdapter不会帮你的。

要解决这个问题,您必须从该位置读取用户对象,并在客户机上手动筛选它们。因此,您应该获得所有用户的列表,然后简单地删除不需要的列表。然后,您可以使用该列表构建一个适配器,并在RecyclerView中显示用户。这并不理想,因为您将失去Firebase-UI库的功能,但它会发挥作用。

但是,如果您考虑在某个时候尝试使用云雾恢复 (我个人推荐),那么这个问题有一个非常简单的解决方案。有一个不相等(=)方法可以执行您所要寻找的确切内容:

使用不等于(!=)运算符返回给定字段存在且不匹配比较值的文档。

在代码中,可能如下所示:

代码语言:javascript
复制
String email = FirebaseAuth.getInstance().getCurrentUser().getEmail();
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference usersRef = rootRef.collection("users");
Query query = usersRef.whereNotEqualTo("email", email);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64704592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档