You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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) {

            }
        });
    }
}

问题分析与解决方案

核心问题

  1. 数据库路径错误:onItemSelected中ref.child("bookingDetails")属于重复嵌套,原ref已经指向Bookings/bookingDetails,重复添加后路径无效,导致筛选逻辑未执行。
  2. 筛选逻辑未落地:创建query后未添加监听事件获取数据,也没有更新RecyclerView的数据源。
  3. 仅处理单月份:只写了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 22:30:33