Android 循环视图中的列表比显示的数据多
列出Account类中两个服务提供商(保姆和儿童活动策划人)的所有信息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
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(...