Android Java任务应用优先级筛选功能开发求助
Android任务应用优先级筛选实现方案
方案一:从Firebase Realtime Database直接查询过滤数据(推荐,适合大数据量场景)
这种方式直接在数据库层面过滤数据,减少本地内存占用,效率更高。
- 定义核心变量
在MainActivity中声明以下变量:
private DatabaseReference userTasksRef; private TaskCardAdapter taskAdapter; private List<TaskModel> taskList = new ArrayList<>(); private int currentFilter = 0; // 0=全部任务, 1=高优先级, 2=中优先级, 3=低优先级 private String currentUserUid; // 当前登录用户的UID
- 初始化Firebase引用
在onCreate方法中初始化用户任务节点的引用:
// 获取当前用户UID(需确保用户已登录) currentUserUid = FirebaseAuth.getInstance().getCurrentUser().getUid(); // 指向当前用户的任务节点 userTasksRef = FirebaseDatabase.getInstance().getReference().child(currentUserUid);
- 绑定按钮点击事件
给四个筛选按钮设置点击监听器,更新筛选状态并加载对应数据:
// All按钮 btnAll.setOnClickListener(v -> { currentFilter = 0; updateButtonStates(); loadFilteredTasks(); }); // 高优先级按钮 btnHighPriority.setOnClickListener(v -> { currentFilter = 1; updateButtonStates(); loadFilteredTasks(); }); // 中优先级按钮 btnMediumPriority.setOnClickListener(v -> { currentFilter = 2; updateButtonStates(); loadFilteredTasks(); }); // 低优先级按钮 btnLowPriority.setOnClickListener(v -> { currentFilter = 3; updateButtonStates(); loadFilteredTasks(); });
- 实现筛选数据加载方法
根据当前筛选条件构建Firebase查询,加载对应任务:
private void loadFilteredTasks() { taskList.clear(); Query taskQuery; if (currentFilter == 0) { // 加载全部任务,按优先级排序(可选) taskQuery = userTasksRef.orderByChild("priority"); } else { // 加载指定优先级的任务 taskQuery = userTasksRef.orderByChild("priority").equalTo(currentFilter); } taskQuery.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { taskList.clear(); for (DataSnapshot taskSnapshot : snapshot.getChildren()) { TaskModel task = taskSnapshot.getValue(TaskModel.class); if (task != null) { taskList.add(task); } } taskAdapter.notifyDataSetChanged(); } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(MainActivity.this, "任务加载失败: " + error.getMessage(), Toast.LENGTH_SHORT).show(); } }); }
- 更新按钮选中状态(可选)
给选中的按钮设置差异化样式,提升用户体验:
private void updateButtonStates() { int selectedColor = getResources().getColor(R.color.btn_selected); int defaultColor = getResources().getColor(R.color.btn_default); btnAll.setBackgroundColor(currentFilter == 0 ? selectedColor : defaultColor); btnHighPriority.setBackgroundColor(currentFilter == 1 ? selectedColor : defaultColor); btnMediumPriority.setBackgroundColor(currentFilter == 2 ? selectedColor : defaultColor); btnLowPriority.setBackgroundColor(currentFilter == 3 ? selectedColor : defaultColor); }
方案二:本地过滤已加载的任务列表(适合小数据量场景)
如果已经预先加载了全部任务到本地列表,可以直接在内存中过滤,避免重复请求数据库。
- 预先加载全部任务
在onCreate中先加载所有任务到本地列表:
private void loadAllTasks() { userTasksRef.orderByChild("priority").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { taskList.clear(); for (DataSnapshot taskSnapshot : snapshot.getChildren()) { TaskModel task = taskSnapshot.getValue(TaskModel.class); if (task != null) { taskList.add(task); } } taskAdapter.notifyDataSetChanged(); } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(MainActivity.this, "任务加载失败: " + error.getMessage(), Toast.LENGTH_SHORT).show(); } }); }
- 实现本地过滤方法
点击按钮时对本地列表进行过滤,并更新Adapter:
private void filterTasks(int priority) { List<TaskModel> filteredList = new ArrayList<>(); if (priority == 0) { filteredList.addAll(taskList); } else { for (TaskModel task : taskList) { if (task.getPriority() == priority) { filteredList.add(task); } } } taskAdapter.updateTaskList(filteredList); }
- 修改Adapter添加更新列表方法
在TaskCardAdapter中添加方法,用于更新显示的任务列表:
public void updateTaskList(List<TaskModel> newTaskList) { this.taskList = newTaskList; notifyDataSetChanged(); }
- 绑定按钮点击事件
按钮点击时调用过滤方法并更新按钮状态:
btnHighPriority.setOnClickListener(v -> { currentFilter = 1; updateButtonStates(); filterTasks(1); }); // 其他按钮同理,对应传入0、2、3
注意事项
- 确保
TaskModel类的字段名与Firebase数据库中的字段完全一致,或使用@PropertyName注解映射字段名。 - 配置Firebase Realtime Database规则,确保用户只能访问自己的任务数据:
{ "rules": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } }
内容的提问来源于stack exchange,提问作者Divyanshu saraswat
相关产品推荐
相关产品推荐

