diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NoteInfoAdapter.java b/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NoteInfoAdapter.java index 4c8ea85..2b9c202 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NoteInfoAdapter.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NoteInfoAdapter.java @@ -120,8 +120,7 @@ public class NoteInfoAdapter extends BaseAdapter { this.selectedIds.clear(); this.selectedIds.addAll(selectedIds); notifyDataSetChanged(); - } else { - // 清空选择状态(包括null和空集合的情况) + } else if (selectedIds == null) { this.selectedIds.clear(); notifyDataSetChanged(); } @@ -139,11 +138,11 @@ public class NoteInfoAdapter extends BaseAdapter { if (selectedIds != null && !selectedIds.isEmpty()) { this.selectedIds.clear(); this.selectedIds.addAll(selectedIds); + notifyDataSetChanged(); } else { - // 清空选择状态(包括null和空列表的情况) this.selectedIds.clear(); + notifyDataSetChanged(); } - notifyDataSetChanged(); } /** diff --git a/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NotesListActivity.java b/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NotesListActivity.java index 9908ee3..1c28720 100644 --- a/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NotesListActivity.java +++ b/src/Notesmaster/app/src/main/java/net/micode/notes/ui/NotesListActivity.java @@ -60,7 +60,6 @@ import net.micode.notes.viewmodel.NotesListViewModel; import com.google.android.material.floatingactionbutton.FloatingActionButton; -import java.util.HashSet; import java.util.List; /** @@ -85,6 +84,7 @@ public class NotesListActivity extends AppCompatActivity private static final int REQUEST_CODE_OPEN_NODE = 102; private static final int REQUEST_CODE_NEW_NODE = 103; private static final int REQUEST_CODE_CHECK_PASSWORD_FOR_OPEN = 104; + private static final int REQUEST_CODE_CHECK_PASSWORD_FOR_LOCK = 105; private NotesListViewModel viewModel; private ListView notesListView; @@ -99,7 +99,11 @@ public class NotesListActivity extends AppCompatActivity private boolean isMultiSelectMode = false; // 待打开的受保护笔记 - private NotesRepository.NoteInfo mPendingNoteToOpen; + private long mPendingNodeIdToOpen = -1; + private int mPendingNodeTypeToOpen = -1; + private static final String KEY_PENDING_NODE_ID = "pending_node_id"; + private static final String KEY_PENDING_NODE_TYPE = "pending_node_type"; + private static final String KEY_CURRENT_FOLDER_ID = "current_folder_id"; /** * 活动创建时的初始化方法 @@ -128,10 +132,36 @@ public class NotesListActivity extends AppCompatActivity }); initViewModel(); + + // 恢复 pending 状态和当前文件夹 + if (savedInstanceState != null) { + mPendingNodeIdToOpen = savedInstanceState.getLong(KEY_PENDING_NODE_ID, -1); + mPendingNodeTypeToOpen = savedInstanceState.getInt(KEY_PENDING_NODE_TYPE, -1); + + long savedFolderId = savedInstanceState.getLong(KEY_CURRENT_FOLDER_ID, Notes.ID_ROOT_FOLDER); + if (savedFolderId != Notes.ID_ROOT_FOLDER) { + viewModel.setCurrentFolderId(savedFolderId); + } + + Log.d(TAG, "Restored pending node: " + mPendingNodeIdToOpen + ", type: " + mPendingNodeTypeToOpen + ", folder: " + savedFolderId); + } + initViews(); observeViewModel(); } + /** + * 保存 Activity 状态 + */ + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putLong(KEY_PENDING_NODE_ID, mPendingNodeIdToOpen); + outState.putInt(KEY_PENDING_NODE_TYPE, mPendingNodeTypeToOpen); + outState.putLong(KEY_CURRENT_FOLDER_ID, viewModel.getCurrentFolderId()); + Log.d(TAG, "Saved pending node: " + mPendingNodeIdToOpen + ", current folder: " + viewModel.getCurrentFolderId()); + } + /** * 活动启动时的回调方法 *
@@ -141,12 +171,10 @@ public class NotesListActivity extends AppCompatActivity
@Override
protected void onStart() {
super.onStart();
- viewModel.loadNotes(Notes.ID_ROOT_FOLDER);
+ // 刷新当前文件夹的笔记,而不是强制加载根目录
+ // 这样可以保证从 PasswordActivity 返回时,如果 onStart 先执行,不会重置为根目录
+ viewModel.refreshNotes();
}
-
- /**
- * 初始化ViewModel
- */
private void initViewModel() {
NotesRepository repository = new NotesRepository(getContentResolver());
viewModel = new ViewModelProvider(this,
@@ -244,6 +272,15 @@ public class NotesListActivity extends AppCompatActivity
// 普通模式
if (note.type == Notes.TYPE_FOLDER) {
// 文件夹:进入该文件夹
+ // 检查隐私锁
+ if (note.isLocked && SecurityManager.getInstance(this).isPasswordSet()) {
+ mPendingNodeIdToOpen = note.getId();
+ mPendingNodeTypeToOpen = note.type;
+ Intent intent = new Intent(this, PasswordActivity.class);
+ intent.setAction(PasswordActivity.ACTION_CHECK_PASSWORD);
+ startActivityForResult(intent, REQUEST_CODE_CHECK_PASSWORD_FOR_OPEN);
+ return;
+ }
viewModel.enterFolder(note.getId());
} else {
// 便签:打开编辑器
@@ -307,26 +344,6 @@ public class NotesListActivity extends AppCompatActivity
}
}
});
-
- // 观察多选模式状态
- viewModel.getIsMultiSelectMode().observe(this, new Observer
- * 公开方法,供Activity调用
- *
@@ -573,8 +533,7 @@ public class NotesListViewModel extends ViewModel {
@Override
public void onSuccess(Integer rowsAffected) {
isLoading.postValue(false);
- selectedNoteIds.clear();
- isMultiSelectMode.postValue(false);
+ // 保持选中状态,方便用户查看
refreshNotes();
Log.d(TAG, "Successfully toggled pin state to " + newPinState);
}
@@ -630,8 +589,6 @@ public class NotesListViewModel extends ViewModel {
@Override
public void onSuccess(Integer rowsAffected) {
isLoading.postValue(false);
- selectedNoteIds.clear();
- isMultiSelectMode.postValue(false);
refreshNotes();
Log.d(TAG, "Successfully toggled lock state to " + newLockState);
}
@@ -688,7 +645,6 @@ public class NotesListViewModel extends ViewModel {
public void onSuccess(Integer rowsAffected) {
isLoading.postValue(false);
selectedNoteIds.clear();
- isMultiSelectMode.postValue(false);
refreshNotes();
Log.d(TAG, "Successfully restored " + rowsAffected + " notes");
}
@@ -724,7 +680,6 @@ public class NotesListViewModel extends ViewModel {
public void onSuccess(Integer rowsAffected) {
isLoading.postValue(false);
selectedNoteIds.clear();
- isMultiSelectMode.postValue(false);
refreshNotes();
Log.d(TAG, "Successfully permanently deleted " + rowsAffected + " notes");
}