Android 循环视图中的列表比显示的数据多

Android 循环视图中的列表比显示的数据多,android,android-fragments,firebase-realtime-database,android-recyclerview,Android,Android Fragments,Firebase Realtime Database,Android Recyclerview,列出Account类中两个服务提供商(保姆和儿童活动策划人)的所有信息 public class Register_Requests extends Fragment { FirebaseAuth mAuth; DatabaseReference refAccount,searchdatabase; FirebaseUser user; private static final String ARG_PARAM1 = "param1"; private static fina

列出Account类中两个服务提供商(保姆和儿童活动策划人)的所有信息

public class Register_Requests extends Fragment {
FirebaseAuth mAuth;
DatabaseReference refAccount,searchdatabase;
FirebaseUser user;
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
RecyclerView recyclerView;
Adapter adapter;
TextView Fullname_Admin;
Button btnlogOutAdmin,search_bar;
String F_name, L_name;
ArrayList<Account> list = new ArrayList();
private String mParam1;
private String mParam2;

public Register_Requests() { }


public static Register_Requests newInstance(String param1, String param2) {
    Register_Requests fragment = new Register_Requests();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);}}

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

    View view= inflater.inflate(R.layout.fragment_register__requests, container, false);
    ImageView imgfake;
    TextView nametext,SPtext,count;
    imgfake=view.findViewById(R.id.imgfake);
    nametext=view.findViewById(R.id.nametext);
    SPtext=view.findViewById(R.id.SPtext);
    count= (TextView) view.findViewById(R.id.counttext);
    btnlogOutAdmin = view.findViewById(R.id.signout_admin);
    Fullname_Admin= (TextView) view.findViewById(R.id.name_admin);
    recyclerView =(RecyclerView)view.findViewById(R.id.recview_SP);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    user= FirebaseAuth.getInstance().getCurrentUser();
    refAccount = FirebaseDatabase.getInstance().getReference().child("Account");
    String Id_admin = FirebaseAuth.getInstance().getCurrentUser().getUid();

    // Welcome admin
     FirebaseDatabase.getInstance().getReference("Admin").child(Id_admin)
            .addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
           Admin admin_display = snapshot.getValue(Admin.class);
           if(admin_display != null){
               F_name = admin_display.getA_FullName();
               L_name = admin_display.getA_LastName();
               Fullname_Admin.setText("Welcome "+F_name+" "+L_name+" !");}}

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            Toast.makeText(getActivity(),"Something Wrong Happened",Toast.LENGTH_SHORT).show();}});

    // Logout admin
    btnlogOutAdmin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FirebaseAuth.getInstance().signOut();
            perfrences.clearData(getActivity());
            getActivity().finish();
            startActivity(new Intent(getActivity(),Login.class));}});

    // List Babysitter and Kids Event Planner from Account
    refAccount.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            list.clear();
            if (snapshot.exists())
            {
                for (DataSnapshot snapshot1: snapshot.getChildren())
                {
                    Account a=snapshot1.getValue(Account.class);
                    list.add(a);
                }
                adapter.notifyDataSetChanged();
                count.setText(adapter.getItemCount()+" Registers"); }
            else
            { nametext.setText("No Available Service Providers");
                nametext.setVisibility(View.VISIBLE);} }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
        }
    });
    // Adapter for recycle view
    FirebaseRecyclerOptions<Account> options =
            new FirebaseRecyclerOptions.Builder<Account>()
                    .setQuery(refAccount, Account.class)
                    .build();

    adapter = new Adapter(options);
    recyclerView.setAdapter(adapter);
    adapter.startListening();
    return view;


}


@Override
public void onStart() {
    super.onStart();
    adapter.startListening();
}

@Override
public void onStop() {
    super.onStop();
    adapter.stopListening();
}}
正如您在account_角色中看到的,这是3个用户,第4个是家长

帐户路径中有16个节点

这些是(服务提供商)的其他路径,共有8个节点

问题是我只调用了服务提供者的信息,它应该在recycle视图中显示8个项目,但这里显示account类中的其余项目,总共16个项目,这意味着显示了8个项目的数据,但其余的是空的,我想显示项目列表作为服务提供者的大小。那么我该如何预防这个问题呢


它显示Account类中的空行。

要仅从
/Account
下获取子节点,并为
Account\u role
指定值,您可以使用查询:

但您只能对单个值(如上面的
babbysitor
)或连续的值范围(如:从
Admin
babbysitor
)执行此操作。无法请求(使用单个查询)所需的多个不同值

一些选择:

  • 对每个值执行查询(如上面所示),然后将结果合并到客户端代码中。它的性能会很好,但代码会多一点
  • 为每个子节点指定一个与您的条件完全匹配的属性,例如:
    “Babbysetter\u或\u KidsEventPlanner”:true
    。然后您可以对该属性进行筛选。如果这样的组合数量有限,这种方法效果最好
  • 对一系列值执行查询,例如:
    ref.orderByChild(“account\u role”).startAt(“保姆”).endAt(“Kids Event Planner”)
    。请记住,这将返回
    帐户\u角色
    值介于
    保姆
    儿童活动计划器
    之间的所有节点,因此它还将包括
    汽车修理工
    的节点。不过,有时这是一个不错的选择,特别是如果您可以根据查询需要对值进行排序/重命名

  • 欢迎来到堆栈溢出。请在此处将所有相关代码包括在您的问题中,因为文本如屏幕截图所示,
    帐户下至少有11个节点。为什么你认为列表应该只显示8个项目?@FrankvanPuffelen因为我在Account类中保存了所有4个用户ID,所以可以通过其在应用程序中的角色和ID轻松调用它。但是在这种情况下,我只想检索两个仅限用户的保姆和儿童活动策划人的信息。您的代码如何过滤它加载到仅限保姆和儿童活动策划人的数据?请记住:您共享了很多代码,而堆栈溢出是一个众所周知的效率低下的交互式调试器。您需要准确地告诉我们问题发生在代码的什么地方。@FrankvanPuffelen运行时没有编译器错误。我已经将4个用户的帐户注册的所有相关数据存储在一个类“account”中,其余的注册信息通过他们自己的类存储。在上面的例子中,我只想从整个account类中检索两个用户的信息,这两个用户是Baby保姆和kids Event Planner(他们总共有8个节点)。我希望我的解释对你来说是清楚的:)非常感谢你,我真的很感谢你的努力。但我想知道。。。如果我选择执行第一个选项,我将如何组合2个查询并将它们添加到InferebaseRecyclerOptions中以完成其余的工作,因为我有特定的数据来检索它。在这种情况下,您将无法使用FirebaseUI中的适配器,因为它们只能显示单个查询的结果。但是您可以将项目添加到
    列表中,然后在该列表上创建适配器。这并不像你想象的那么难。例如,请参阅,更多信息来自:听起来不错。谢谢,不客气。
    
    public class Adapter extends FirebaseRecyclerAdapter<Account, Adapter.viewHolder>  {
        DatabaseReference Ref,Ref2,check;
        boolean flag =true, flag2=true;
        String userIDs,total_count,IDsitter,IDplanner;
    
        public Adapter(@NonNull FirebaseRecyclerOptions<Account> options) { super(options); }
    
        @Override
        protected void onBindViewHolder(@NonNull viewHolder holder, int position, @NonNull Account model) {
            Ref= FirebaseDatabase.getInstance().getReference("Babysitter");
            Ref2= FirebaseDatabase.getInstance().getReference("Kids Event Planner");
            userIDs = model.user_id;
    
            // Print all the Babysitter
            Ref.child(userIDs).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                 if(snapshot.exists()){
    
                     if(snapshot.hasChild("b_FirstName")){
                     String Fname = snapshot.child("b_FirstName").getValue().toString();
                     String Lname = snapshot.child("b_LastName").getValue().toString();
                     String photo = snapshot.child("b_Photo").getValue().toString();
                     String gender = snapshot.child("b_Gender").getValue().toString();
                     String nationality = snapshot.child("b_Nationality").getValue().toString();
                     String phone = snapshot.child("b_Phone").getValue().toString();
                     String B_date = snapshot.child("b_BirthDate").getValue().toString();
                     int Y_e = parseInt(snapshot.child("years_of_Experience").getValue().toString());
                     String exp= Integer.toString(Y_e);
                     String state= snapshot.child("registration_Status").getValue().toString();
                     String educate= snapshot.child("b_EducationLevel").getValue().toString();
    
    
                     holder.nametext.setText(Fname +" "+ Lname );
                     holder.SPtext.setText(model.getAccount_role());
                     Picasso.with(holder.imgfake.getContext()).load(photo).placeholder(R.drawable.ic_action_name).into(holder.imgfake);
    
                     holder.itemView.setOnClickListener(new View.OnClickListener() {
                     @Override
                     public void onClick(View view) {
                     AppCompatActivity activity=(AppCompatActivity)view.getContext();
                     activity.getSupportFragmentManager().beginTransaction().replace(R.id.container, new eachInfo_SP(model.user_id,Fname,Lname,photo,
                     gender,nationality,phone,B_date,model.getAccount_email(),model.getAccount_role(), exp,state,educate)).addToBackStack(null).commit();}});}
                     else { flag=false;System.out.println("No values");} if (!(model.account_role.equals("Admin"))&& !(model.account_role.equals("Parent")) ){
                         // Log.e(String.valueOf(snapshot.getKey().equals(userIDs)), snapshot.getChildrenCount() + " Registers");
                         total_count = snapshot.getChildrenCount() + " Registers";
                         System.out.println(total_count);
                     }}}
    
                @Override
                public void onCancelled(@NonNull DatabaseError error) {}});
    
                // Print all the KEP
                Ref2.child(userIDs).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        if(snapshot.exists()){
                            KidsEventPlanner k= snapshot.getValue(KidsEventPlanner.class);
    
                        if(snapshot.hasChild("e_FirstName")){
                        String Fname = snapshot.child("e_FirstName").getValue().toString();
                        String Lname = snapshot.child("e_LastName").getValue().toString();
                        String photo = snapshot.child("e_Photo").getValue().toString();
                        String gender = snapshot.child("e_Gender").getValue().toString();
                        String nationality = snapshot.child("e_Nationality").getValue().toString();
                        String phone = snapshot.child("e_Phone").getValue().toString();
                        String B_date = snapshot.child("e_BirthDate").getValue().toString();
                        int Y_e = parseInt(snapshot.child("years_of_experience").getValue().toString());
                        String exp= Integer.toString(Y_e);
                        String state= snapshot.child("registration_status").getValue().toString();
                        String educate= snapshot.child("e_EducationLevel").getValue().toString();
    
    
                        holder.nametext.setText(Fname +" "+ Lname );
                        holder.SPtext.setText(model.getAccount_role());
                        Picasso.with(holder.imgfake.getContext()).load(photo).placeholder(R.drawable.ic_action_name).into(holder.imgfake);
    
                        holder.itemView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                        AppCompatActivity activity=(AppCompatActivity)view.getContext();
                        activity.getSupportFragmentManager().beginTransaction().replace(R.id.container, new eachInfo_SP(model.user_id,Fname,Lname,photo,
                        gender,nationality,phone,B_date,model.getAccount_email(),model.getAccount_role(), exp, state,educate)).addToBackStack(null).commit();}});}
                        else{flag2 = false; System.out.println("False");}} }
    
                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {}});
    
        }
    
        @NonNull
        @Override
        public viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.singlerowdata,parent,false);
            viewHolder viewHolder = new viewHolder(view);
            return viewHolder;}
    
        public class viewHolder extends RecyclerView.ViewHolder
        {
            ImageView imgfake;
            TextView nametext,SPtext,count;
            public viewHolder(@NonNull View itemView) {
                super(itemView);
                imgfake=itemView.findViewById(R.id.imgfake);
                nametext=itemView.findViewById(R.id.nametext);
                SPtext=itemView.findViewById(R.id.SPtext);
                count= (TextView) itemView.findViewById(R.id.counttext);}}
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public int getItemViewType(int position) {
            return position;
        }
    
    }
    
    public class Account  {
    
        String account_email,account_password ,account_role, user_id;
    
        public Account() {}
    
        public Account(String account_email, String account_password, String account_role, String user_id) {
            this.account_email = account_email;
            this.account_password = account_password;
            this.account_role = account_role;
            this.user_id = user_id;
        }
    
        public String getAccount_email() {return account_email;}
    
        public void setAccount_email(String account_email) {this.account_email = account_email;}
    
        public String getAccount_password() {return account_password;}
    
        public void setAccount_password(String account_password) {this.account_password = account_password; }
    
        public String getAccount_role() {return account_role;}
    
        public void setAccount_role(String account_role) {this.account_role = account_role; }
    
        public String getUser_id() { return user_id; }
    
        public void setUser_id(String user_id) { this.user_id = user_id;}
    }
    
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Account");
    Query query = ref.orderByChild("account_role").equalTo("Babysitter");
    query. addListenerForSingleValueEvent(...