Android Studio中用Spinner筛选Firebase数据库RecyclerView月度预约数据
问题描述
我正在使用Android Studio,以Firebase作为数据库,尝试通过Spinner筛选月度预约数据,但当前if条件逻辑存在问题,筛选1月时9月的预约仍会显示。我需要正确的if语句逻辑来实现按月份过滤数据。
数据库截图

应用截图

当前代码
public class adminAppoinment extends AppCompatActivity { ImageView drawerButton; RecyclerView recyclerView; List<Bookings>bookingsList; List<ModelUser>modelUsers; AppointmentAdapter appointmentAdapter; Spinner months; String month; private ActivityAdminAppoinmentBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityAdminAppoinmentBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); NavigationView navigationView = (binding.navView); navigationView.setCheckedItem(R.id.nav_adminAppointment); DrawerLayout drawerLayout = (binding.drawerLayout); drawerButton = (binding.hamburger); drawerButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { drawerLayout.openDrawer(GravityCompat.START); } }); recyclerView = binding.recyclerView; recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(getApplication())); bookingsList = new ArrayList<>(); modelUsers = new ArrayList<>(); months = binding.spinner3; ArrayAdapter<CharSequence>adapterMonth = ArrayAdapter.createFromResource(this,R.array.months, androidx.appcompat.R.layout.support_simple_spinner_dropdown_item); adapterMonth.setDropDownViewResource(androidx.appcompat.R.layout.support_simple_spinner_dropdown_item); months.setAdapter(adapterMonth); months.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { month = parent.getItemAtPosition(position).toString(); DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Bookings").child("bookingDetails"); Query query; //if january then 1, then filter by month 1 from database if (position == 1){ query = ref.child("bookingDetails").orderByChild("month").equalTo("January"); } } @Override public void onNothingSelected(AdapterView<?> parent) { getAllBooks(); } }); getAllBooks(); navigationView.setCheckedItem(R.id.nav_adminAppointment); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()){ case R.id.nav_home: startActivity(new Intent(getApplication(), govethome2.class)); drawerLayout.closeDrawer(GravityCompat.START); finishAfterTransition(); break; case R.id.nav_adminUsers: startActivity(new Intent(getApplication(),adminUsers.class)); finishAfterTransition(); drawerLayout.closeDrawer(GravityCompat.START); item.setChecked(true); break; case R.id.nav_adminAppointment: item.setChecked(true); drawerLayout.closeDrawer(GravityCompat.START); break; case R.id.nav_adminOnlinePayment: startActivity(new Intent(getApplication(),adminOnlinePayments.class)); drawerLayout.closeDrawer(GravityCompat.START); finishAfterTransition(); break; case R.id.nav_adminSettings: startActivity(new Intent(getApplication(),adminSettings.class)); drawerLayout.closeDrawer(GravityCompat.START); finishAfterTransition(); break; } return true; } }); } private void getAllBooks() { DatabaseReference mDatabase =FirebaseDatabase.getInstance().getReference("Bookings"); FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Bookings").child("bookingDetails"); ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { bookingsList.clear(); for(DataSnapshot ds : snapshot.getChildren()){ Bookings bookings = ds.getValue(Bookings.class); if(!bookings.getName().equals(firebaseUser.getDisplayName())){ bookingsList.add(bookings); } appointmentAdapter = new AppointmentAdapter(getApplication(), bookingsList); recyclerView.setAdapter(appointmentAdapter); recyclerView.setVisibility(View.VISIBLE); } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } }
问题分析与解决方案
核心问题
- 数据库路径错误:
onItemSelected中ref.child("bookingDetails")属于重复嵌套,原ref已经指向Bookings/bookingDetails,重复添加后路径无效,导致筛选逻辑未执行。 - 筛选逻辑未落地:创建
query后未添加监听事件获取数据,也没有更新RecyclerView的数据源。 - 仅处理单月份:只写了1月的筛选逻辑,其他月份无法触发过滤。
修正后的代码逻辑
1. 修复Spinner筛选逻辑
重写onItemSelected方法,统一处理全月份筛选,并正确执行查询与数据更新:
months.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { month = parent.getItemAtPosition(position).toString(); DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Bookings").child("bookingDetails"); // 若Spinner第一项是提示项(如"选择月份"),则显示全部数据 if (position == 0) { getAllBooks(); return; } // 根据选中月份执行筛选查询 Query query = ref.orderByChild("month").equalTo(month); query.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { bookingsList.clear(); FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); for(DataSnapshot ds : snapshot.getChildren()){ Bookings bookings = ds.getValue(Bookings.class); if(bookings != null && !bookings.getName().equals(firebaseUser.getDisplayName())){ bookingsList.add(bookings); } } // 更新适配器数据 appointmentAdapter.notifyDataSetChanged(); recyclerView.setVisibility(View.VISIBLE); } @Override public void onCancelled(@NonNull DatabaseError error) { // 可添加错误提示逻辑 } }); } @Override public void onNothingSelected(AdapterView<?> parent) { getAllBooks(); } });
2. 优化getAllBooks方法
将适配器初始化移到循环外,避免重复创建:
private void getAllBooks() { DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Bookings").child("bookingDetails"); FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { bookingsList.clear(); for(DataSnapshot ds : snapshot.getChildren()){ Bookings bookings = ds.getValue(Bookings.class); if(bookings != null && !bookings.getName().equals(firebaseUser.getDisplayName())){ bookingsList.add(bookings); } } // 初始化或更新适配器 if (appointmentAdapter == null) { appointmentAdapter = new AppointmentAdapter(getApplication(), bookingsList); recyclerView.setAdapter(appointmentAdapter); } else { appointmentAdapter.notifyDataSetChanged(); } recyclerView.setVisibility(View.VISIBLE); } @Override public void onCancelled(@NonNull DatabaseError error) { // 可添加错误提示逻辑 } }); }
3. 额外注意事项
- 确保
R.array.months中的月份名称与Firebase数据库month字段值完全一致(含大小写)。 - 在Firebase控制台添加索引优化查询性能,数据库规则配置如下:
{ "rules": { "Bookings": { "bookingDetails": { ".indexOn": ["month"] } } } }
内容的提问来源于stack exchange,提问作者Zephyr
相关产品推荐
相关产品推荐

