diff --git a/stallhelper/build.properties b/stallhelper/build.properties index b570070..37fcbed 100644 --- a/stallhelper/build.properties +++ b/stallhelper/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Fri May 22 19:00:55 HKT 2026 +#Fri May 22 19:31:43 HKT 2026 stageCount=6 libraryProject= baseVersion=15.20 publishVersion=15.20.5 -buildCount=0 +buildCount=1 baseBetaVersion=15.20.6 diff --git a/stallhelper/src/main/java/cc/winboll/studio/stallhelper/activities/TaskSchedulerActivity.java b/stallhelper/src/main/java/cc/winboll/studio/stallhelper/activities/TaskSchedulerActivity.java index d037a83..05b2b09 100644 --- a/stallhelper/src/main/java/cc/winboll/studio/stallhelper/activities/TaskSchedulerActivity.java +++ b/stallhelper/src/main/java/cc/winboll/studio/stallhelper/activities/TaskSchedulerActivity.java @@ -2,6 +2,8 @@ package cc.winboll.studio.stallhelper.activities; import android.app.Dialog; import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; import android.view.ContextMenu; import android.view.LayoutInflater; import android.view.MenuItem; @@ -25,6 +27,11 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import net.sourceforge.pinyin4j.PinyinHelper; +import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; +import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; +import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; + /** * @Author ZhanGSKen * @Date 2026/05/18 @@ -41,6 +48,9 @@ public class TaskSchedulerActivity extends WinBoLLActivity { ArrayList mTaskList; TaskSchedulerAdapter mAdapter; + EditText mSearchEditText; + String mSearchQuery = ""; + HanyuPinyinOutputFormat mPinyinFormat; @Override public String getTag() { @@ -61,6 +71,28 @@ public class TaskSchedulerActivity extends WinBoLLActivity { mTaskList = new ArrayList(); loadTaskData(); + // 设置搜索框 + mPinyinFormat = new HanyuPinyinOutputFormat(); + mPinyinFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE); + mPinyinFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE); + + mSearchEditText = findViewById(R.id.et_search); + mSearchEditText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void afterTextChanged(Editable s) { + mSearchQuery = s.toString().trim().toLowerCase(); + filterTaskList(); + } + }); + // 设置 RecyclerView RecyclerView recyclerView = findViewById(R.id.task_scheduler_recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false)); @@ -98,6 +130,12 @@ public class TaskSchedulerActivity extends WinBoLLActivity { sortTaskList(); } + private void applyChanges() { + sortTaskList(); + filterTaskList(); + saveTaskData(); + } + /** * 保存任务数据到文件 */ @@ -196,6 +234,76 @@ public class TaskSchedulerActivity extends WinBoLLActivity { mTaskList.add(new TaskSchedulerBean("烹饪晚餐", "制作丰盛的晚餐", time17, 90)); } + /** + * 将中文转换为拼音(不含声调,小写) + */ + private String toPinyin(String chinese) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < chinese.length(); i++) { + char c = chinese.charAt(i); + try { + String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c, mPinyinFormat); + if (pinyins != null && pinyins.length > 0) { + sb.append(pinyins[0]); + } + } catch (Exception e) { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 将中文转换为拼音首字母串(小写) + */ + private String toPinyinInitials(String chinese) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < chinese.length(); i++) { + char c = chinese.charAt(i); + try { + String[] pinyins = PinyinHelper.toHanyuPinyinStringArray(c, mPinyinFormat); + if (pinyins != null && pinyins.length > 0) { + sb.append(pinyins[0].charAt(0)); + } + } catch (Exception e) { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 检查任务名称是否匹配搜索关键词(支持中文/拼音/首字母) + */ + private boolean matchesSearch(TaskSchedulerBean task, String query) { + if (query == null || query.isEmpty()) return true; + String name = task.getTaskName(); + if (name == null) return false; + if (name.toLowerCase().contains(query)) return true; + String pinyin = toPinyin(name); + if (pinyin.contains(query)) return true; + String initials = toPinyinInitials(name); + if (initials.contains(query)) return true; + return false; + } + + /** + * 根据搜索关键词过滤任务列表并刷新界面 + */ + private void filterTaskList() { + if (mSearchQuery.isEmpty()) { + mAdapter.setData(mTaskList); + return; + } + ArrayList filteredList = new ArrayList(); + for (TaskSchedulerBean task : mTaskList) { + if (matchesSearch(task, mSearchQuery)) { + filteredList.add(task); + } + } + mAdapter.setData(filteredList); + } + /** * 将月、天、小时转换为总分钟数 * @param month 月份 @@ -341,9 +449,7 @@ public class TaskSchedulerActivity extends WinBoLLActivity { task.setDurationMinutes(durationMinutes); task.setRemark(remark); - sortTaskList(); - mAdapter.notifyDataSetChanged(); - saveTaskData(); + applyChanges(); LogUtils.i(TAG, "showEditTaskDialog: 任务 [" + taskName + "] 数据已更新,排档幅度=" + durationMinutes + "分钟"); dialog.dismiss(); } @@ -432,9 +538,7 @@ public class TaskSchedulerActivity extends WinBoLLActivity { int durationMinutes = convertToTotalMinutes(month, day, hour); TaskSchedulerBean newTask = new TaskSchedulerBean(taskName, remark, timestamp, durationMinutes); mTaskList.add(newTask); - sortTaskList(); - mAdapter.notifyDataSetChanged(); - saveTaskData(); + applyChanges(); LogUtils.i(TAG, "showAddTaskDialog: 任务 [" + taskName + "] 已添加,排档幅度=" + durationMinutes + "分钟"); dialog.dismiss(); } @@ -506,9 +610,7 @@ public class TaskSchedulerActivity extends WinBoLLActivity { public void onClick(View v) { String taskName = task.getTaskName(); mTaskList.remove(position); - sortTaskList(); - mAdapter.notifyDataSetChanged(); - saveTaskData(); + applyChanges(); LogUtils.i(TAG, "showDeleteConfirmDialog: 任务 [" + taskName + "] 已删除"); dialog.dismiss(); } @@ -580,9 +682,7 @@ public class TaskSchedulerActivity extends WinBoLLActivity { long newTime = currentTime + duration * 60 * 1000L; LogUtils.i(TAG, "performSchedule: 当前时间 " + formatTimestamp(currentTime) + " + " + duration + "分钟 = " + formatTimestamp(newTime)); currentTask.setCurrentScheduleTime(newTime); - sortTaskList(); - mAdapter.notifyDataSetChanged(); - saveTaskData(); + applyChanges(); LogUtils.i(TAG, "performSchedule: 更新任务 [" + currentTask.getTaskName() + "] 时间更新为 " + formatTimestamp(newTime)); } @@ -597,6 +697,11 @@ public class TaskSchedulerActivity extends WinBoLLActivity { mDataList = dataList; } + public void setData(ArrayList dataList) { + mDataList = dataList; + notifyDataSetChanged(); + } + @Override public int getItemCount() { return mDataList.size(); diff --git a/stallhelper/src/main/res/layout/activity_task_scheduler.xml b/stallhelper/src/main/res/layout/activity_task_scheduler.xml index e99bd0e..dc5af32 100644 --- a/stallhelper/src/main/res/layout/activity_task_scheduler.xml +++ b/stallhelper/src/main/res/layout/activity_task_scheduler.xml @@ -16,6 +16,17 @@ android:background="?attr/toolbarBackgroundColor" android:id="@+id/toolbar"/> + +