From dd6135de2fc4417d02f8a0b41ca1839b45a306a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=8E=E8=90=8D?= <2607757018@qq.com> Date: Mon, 30 Oct 2023 16:11:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E7=B1=B3=E4=BE=BF=E7=AD=BE=E6=BA=90?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../micode/notes/ui/NotesListActivity.java | 154 +++++++++++++----- .../net/micode/notes/ui/NotesListAdapter.java | 62 +++++-- 2 files changed, 159 insertions(+), 57 deletions(-) diff --git a/src/MiNote/app/src/main/java/net/micode/notes/ui/NotesListActivity.java b/src/MiNote/app/src/main/java/net/micode/notes/ui/NotesListActivity.java index 77a30b8..434c932 100644 --- a/src/MiNote/app/src/main/java/net/micode/notes/ui/NotesListActivity.java +++ b/src/MiNote/app/src/main/java/net/micode/notes/ui/NotesListActivity.java @@ -81,21 +81,19 @@ import java.io.InputStreamReader; import java.util.HashSet; public class NotesListActivity extends AppCompatActivity implements OnClickListener, OnItemLongClickListener { + //folder_note_list_query_token folder_list_query_token private static final int FOLDER_NOTE_LIST_QUERY_TOKEN = 0; - private static final int FOLDER_LIST_QUERY_TOKEN = 1; - + //menu_folder_delete menu_folder_view menu_folder_change_name private static final int MENU_FOLDER_DELETE = 0; - private static final int MENU_FOLDER_VIEW = 1; - private static final int MENU_FOLDER_CHANGE_NAME = 2; - + //preference_add_introduction,单行超过80个字符 private static final String PREFERENCE_ADD_INTRODUCTION = "net.micode.notes.introduction"; private enum ListEditState { NOTE_LIST, SUB_FOLDER, CALL_RECORD_FOLDER - }; + };//note_list sub_folder call_record_folder private ListEditState mState; @@ -134,15 +132,21 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe + NoteColumns.ID + "=" + Notes.ID_CALL_RECORD_FOLDER + " AND " + NoteColumns.NOTES_COUNT + ">0)"; + //request_code_open_node request_code_new_node private final static int REQUEST_CODE_OPEN_NODE = 102; private final static int REQUEST_CODE_NEW_NODE = 103; - @Override + //onCreate()的Bundle需要是final类型 + /*根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。 + final类不能被继承,没有子类,final类中的方法默认是final的。 + final方法不能被子类的方法覆盖,但可以被继承。 + final成员变量表示常量,只能被赋值一次,赋值后值不再改变。 + final不能用于修饰构造方法。*/ protected void onCreate(Bundle savedInstanceState) { + //调用父类的onCreate()函数,加载首页布局文件,初始化资源 super.onCreate(savedInstanceState); setContentView(R.layout.note_list); initResources(); - /** * Insert an introduction when user firstly use this application */ @@ -150,26 +154,36 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } @Override + //返回一些子模块完成的数据交给主Activity处理 protected void onActivityResult(int requestCode, int resultCode, Intent data) { + //返回的结果值 和 要求值 相等 if (resultCode == RESULT_OK && (requestCode == REQUEST_CODE_OPEN_NODE || requestCode == REQUEST_CODE_NEW_NODE)) { mNotesListAdapter.changeCursor(null); } else { + //调用Activity的onActivityResult() super.onActivityResult(requestCode, resultCode, data); } } - + //首次打开加载默认便签 private void setAppInfoFromRawRes() { + //Android平台提供了一个SharedPreferences类,这是一个轻量级的存储类,特别适合用于保存软件配置参数 SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); + //判断程序是否首次安装,进入指定界面,用到 sharedPreferences 保存一个 + // key为"PREFERENCE_ADD_INTRODUCTION",boolean为true的键值对。 + // 如果创建Preferences成功,检索key对应的值,不成功就返回默认值false if (!sp.getBoolean(PREFERENCE_ADD_INTRODUCTION, false)) { StringBuilder sb = new StringBuilder(); InputStream in = null; try { + //把资源文件放到应用程序的/raw/raw下,那么就可以在应用中使用getResources获取资源后, + //以openRawResource方法(不带后缀的资源文件名)打开这个文件。 + //第一次打开软件,获取第一条默认便签的内容存进sb in = getResources().openRawResource(R.raw.introduction); if (in != null) { InputStreamReader isr = new InputStreamReader(in); BufferedReader br = new BufferedReader(isr); - char [] buf = new char[1024]; + char [] buf = new char[1024];//自行定义的数值,使用者不知道有什么意义 int len = 0; while ((len = br.read(buf)) > 0) { sb.append(buf, 0, len); @@ -191,12 +205,15 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } } } - + //在根目录创建空的,粉色的第一条默认便签WorkingNote + //public static WorkingNote createEmptyNote(Context context, long folderId, int widgetId, + // int widgetType, int defaultBgColorId) WorkingNote note = WorkingNote.createEmptyNote(this, Notes.ID_ROOT_FOLDER, AppWidgetManager.INVALID_APPWIDGET_ID, Notes.TYPE_WIDGET_INVALIDE, ResourceParser.RED); note.setWorkingText(sb.toString()); if (note.saveNote()) { + //更新保存note的信息 sp.edit().putBoolean(PREFERENCE_ADD_INTRODUCTION, true).commit(); } else { Log.e(TAG, "Save introduction note error"); @@ -211,20 +228,29 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe startAsyncNotesListQuery(); } + //初始化资源 private void initResources() { - mContentResolver = this.getContentResolver(); + mContentResolver = this.getContentResolver();//获取应用程序的数据,得到类似数据表的东西 mBackgroundQueryHandler = new BackgroundQueryHandler(this.getContentResolver()); + //默认当前文件夹是根目录 mCurrentFolderId = Notes.ID_ROOT_FOLDER; + + //findViewById 是安卓编程的定位函数,主要是引用.R文件里的引用名 mNotesListView = (ListView) findViewById(R.id.notes_list); + //绑定XML中的ListView,作为新建的便签Item的容器 mNotesListView.addFooterView(LayoutInflater.from(this).inflate(R.layout.note_list_footer, null), null, false); + //为列表分别设置短按监听器和长按监听器 mNotesListView.setOnItemClickListener(new OnListItemClickListener()); mNotesListView.setOnItemLongClickListener(this); + //为便签列表绑定适配器 mNotesListAdapter = new NotesListAdapter(this); mNotesListView.setAdapter(mNotesListAdapter); + //在Activity中获取“新建便签”按钮,并为其分别设置短按监听器和触碰监听器 mAddNewNote = (Button) findViewById(R.id.btn_new_note); mAddNewNote.setOnClickListener(this); mAddNewNote.setOnTouchListener(new NewNoteOnTouchListener()); + mDispatch = false; mDispatchY = 0; mOriginY = 0; @@ -232,7 +258,7 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe mState = ListEditState.NOTE_LIST; mModeCallBack = new ModeCallback(); } - + //实现接口ListView.MultiChoiceModeListener 和 OnMenuItemClickListener private class ModeCallback implements ListView.MultiChoiceModeListener, OnMenuItemClickListener { private DropdownMenu mDropDownMenu; private ActionMode mActionMode; @@ -266,15 +292,16 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe updateMenu(); return true; } - }); return true; } + //更新菜单:当页面已经全选时,菜单更改为“取消全选”;负责,菜单显示为“全选” private void updateMenu() { int selectedCount = mNotesListAdapter.getSelectedCount(); // Update dropdown menu String format = getResources().getString(R.string.menu_select_title, selectedCount); + //更改标题 mDropDownMenu.setTitle(format); MenuItem item = mDropDownMenu.findItem(R.id.action_select_all); if (item != null) { @@ -297,7 +324,7 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe // TODO Auto-generated method stub return false; } - + //取消删除模式时,“新建便签”按钮重新可视 public void onDestroyActionMode(ActionMode mode) { mNotesListAdapter.setChoiceMode(false); mNotesListView.setLongClickable(true); @@ -313,7 +340,7 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe mNotesListAdapter.setCheckedItem(position, checked); updateMenu(); } - + //长按便签后的顶部菜单选项点击后的处理 public boolean onMenuItemClick(MenuItem item) { if (mNotesListAdapter.getSelectedCount() == 0) { Toast.makeText(NotesListActivity.this, getString(R.string.menu_select_none), @@ -322,6 +349,7 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } switch (item.getItemId()) { + //选择删除便签 case R.id.delete: AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); builder.setTitle(getString(R.string.alert_title_delete)); @@ -338,18 +366,19 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe builder.setNegativeButton(android.R.string.cancel, null); builder.show(); break; + //选择移动便签 case R.id.move: startQueryDestinationFolders(); break; + //默认没有选择 default: return false; } return true; - } + }//处理完毕 } - + //“新建便签”点击后界面显示参数设置 private class NewNoteOnTouchListener implements OnTouchListener { - public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { @@ -408,8 +437,8 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe return false; } - }; - + } + //异步处理查询 首页/文件夹下 的便签列表 private void startAsyncNotesListQuery() { String selection = (mCurrentFolderId == Notes.ID_ROOT_FOLDER) ? ROOT_FOLDER_SELECTION : NORMAL_SELECTION; @@ -423,7 +452,7 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe public BackgroundQueryHandler(ContentResolver contentResolver) { super(contentResolver); } - + //后台查询后显示查询结果 @Override protected void onQueryComplete(int token, Object cookie, Cursor cursor) { switch (token) { @@ -444,11 +473,11 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } private void showFolderListMenu(Cursor cursor) { + //文件列表的警告对话框,并配置适配器 AlertDialog.Builder builder = new AlertDialog.Builder(NotesListActivity.this); builder.setTitle(R.string.menu_title_select_folder); final FoldersListAdapter adapter = new FoldersListAdapter(this, cursor); builder.setAdapter(adapter, new DialogInterface.OnClickListener() { - public void onClick(DialogInterface dialog, int which) { DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter.getSelectedItemIds(), adapter.getItemId(which)); @@ -463,28 +492,29 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe }); builder.show(); } - + //启动新建便签的新活动 private void createNewNote() { Intent intent = new Intent(this, NoteEditActivity.class); intent.setAction(Intent.ACTION_INSERT_OR_EDIT); intent.putExtra(Notes.INTENT_EXTRA_FOLDER_ID, mCurrentFolderId); this.startActivityForResult(intent, REQUEST_CODE_NEW_NODE); } - + //删除便签(考虑是否处于同步模式) private void batchDelete() { new AsyncTask>() { protected HashSet doInBackground(Void... unused) { HashSet widgets = mNotesListAdapter.getSelectedWidget(); if (!isSyncMode()) { // if not synced, delete notes directly + //如果没有同步,直接删除便签 if (DataUtils.batchDeleteNotes(mContentResolver, mNotesListAdapter .getSelectedItemIds())) { } else { Log.e(TAG, "Delete notes error, should not happens"); } } else { - // in sync mode, we'll move the deleted note into the trash - // folder + // in sync mode, we'll move the deleted note into the trash folder + //在同步模式下,我们会将已删除的笔记移入回收站文件夹 if (!DataUtils.batchMoveToFolder(mContentResolver, mNotesListAdapter .getSelectedItemIds(), Notes.ID_TRASH_FOLER)) { Log.e(TAG, "Move notes to trash folder error, should not happens"); @@ -507,7 +537,7 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } }.execute(); } - + //删除文件夹(考虑是否处于同步模式) private void deleteFolder(long folderId) { if (folderId == Notes.ID_ROOT_FOLDER) { Log.e(TAG, "Wrong folder id, should not happen " + folderId); @@ -534,14 +564,14 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } } } - + //打开便签,跳转新活动 private void openNode(NoteItemData data) { Intent intent = new Intent(this, NoteEditActivity.class); intent.setAction(Intent.ACTION_VIEW); intent.putExtra(Intent.EXTRA_UID, data.getId()); this.startActivityForResult(intent, REQUEST_CODE_OPEN_NODE); } - + //打开文件夹,标题可见 private void openFolder(NoteItemData data) { mCurrentFolderId = data.getId(); startAsyncNotesListQuery(); @@ -558,7 +588,7 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } mTitleBar.setVisibility(View.VISIBLE); } - + //点击“新建便签”的按钮,调用createNewNote()函数新建便签 public void onClick(View v) { switch (v.getId()) { case R.id.btn_new_note: @@ -568,23 +598,24 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe break; } } - + //显示输入光标,接收输入 private void showSoftInput() { InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (inputMethodManager != null) { inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); } } - + //隐藏输入光标,不接受输入 private void hideSoftInput(View view) { InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(), 0); } - + //新建/修改文件夹显示对话框内容 private void showCreateOrModifyFolderDialog(final boolean create) { final AlertDialog.Builder builder = new AlertDialog.Builder(this); View view = LayoutInflater.from(this).inflate(R.layout.dialog_edit_text, null); final EditText etName = (EditText) view.findViewById(R.id.et_foler_name); + //显示光标,接受输入 showSoftInput(); if (!create) { if (mFocusNoteDataItem != null) { @@ -602,6 +633,7 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe builder.setPositiveButton(android.R.string.ok, null); builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { + //取消,关闭光标显示,不接受输入 hideSoftInput(etName); } }); @@ -666,6 +698,10 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe }); } + /* (non-Javadoc) + * @see android.app.Activity#onBackPressed() + * 按返回键时根据情况更改类中的数据 + */ @Override public void onBackPressed() { switch (mState) { @@ -690,6 +726,11 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } } + /** + * @param appWidgetId + * @param appWidgetType + * 根据不同类型的widget更新插件,通过intent传送数据 + */ private void updateWidget(int appWidgetId, int appWidgetType) { Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE); if (appWidgetType == Notes.TYPE_WIDGET_2X) { @@ -709,7 +750,8 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe setResult(RESULT_OK, intent); } - private final OnCreateContextMenuListener mFolderOnCreateContextMenuListener = new OnCreateContextMenuListener() { + //声明监听器:建立文件夹的菜单,包括名称,视图,删除操作,更改名称操作; + private final OnCreateContextMenuListener mFolderOnCreateContextMenuListener = new OnCreateContextMenuListener() { public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { if (mFocusNoteDataItem != null) { menu.setHeaderTitle(mFocusNoteDataItem.getSnippet()); @@ -719,7 +761,7 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } } }; - + //关闭文件夹 @Override public void onContextMenuClosed(Menu menu) { if (mNotesListView != null) { @@ -727,7 +769,10 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } super.onContextMenuClosed(menu); } - + /* (non-Javadoc) + * @see android.app.Activity#onContextItemSelected(android.view.MenuItem) + * 针对首页长按文件夹的menu中不同的选择进行不同的处理,里面详细注释 + */ @Override public boolean onContextItemSelected(MenuItem item) { if (mFocusNoteDataItem == null) { @@ -736,9 +781,11 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } switch (item.getItemId()) { case MENU_FOLDER_VIEW: + //打开对应文件 openFolder(mFocusNoteDataItem); break; case MENU_FOLDER_DELETE: + //设置确认是否删除的对话框 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(getString(R.string.alert_title_delete)); builder.setIcon(android.R.drawable.ic_dialog_alert); @@ -750,15 +797,16 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } }); builder.setNegativeButton(android.R.string.cancel, null); + //显示对话框 builder.show(); break; case MENU_FOLDER_CHANGE_NAME: + //调用方法修改文件夹名称,其中参数false表示修改文件夹名,true是新建文件夹 showCreateOrModifyFolderDialog(false); break; default: break; } - return true; } @@ -779,18 +827,21 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } return true; } - + //首页右上角菜单选项显示和按钮的点击后处理 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { + //新建文件夹 case R.id.menu_new_folder: { showCreateOrModifyFolderDialog(true); break; } + //导出文本 case R.id.menu_export_text: { exportNoteToText(); break; } + //选择是否同步 case R.id.menu_sync: { if (isSyncMode()) { if (TextUtils.equals(item.getTitle(), getString(R.string.menu_sync))) { @@ -803,14 +854,17 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } break; } + //软件设置 case R.id.menu_setting: { startPreferenceActivity(); break; } + //新建便签 case R.id.menu_new_note: { createNewNote(); break; } + //搜索 case R.id.menu_search: onSearchRequested(); break; @@ -820,12 +874,17 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe return true; } + /* (non-Javadoc) + * @see android.app.Activity#onSearchRequested() + * 直接调用startSearch函数 + */ @Override public boolean onSearchRequested() { startSearch(null, false, null /* appData */, false); return true; } + //功能:实现将便签导出到文本功能 private void exportNoteToText() { final BackupUtils backup = BackupUtils.getInstance(NotesListActivity.this); new AsyncTask() { @@ -868,20 +927,26 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe }.execute(); } + /** + * @return + * 功能:判断是否正在同步 + */ private boolean isSyncMode() { return NotesPreferenceActivity.getSyncAccountName(this).trim().length() > 0; } + //功能:跳转到PreferenceActivity界面,设置软件参数 private void startPreferenceActivity() { Activity from = getParent() != null ? getParent() : this; Intent intent = new Intent(from, NotesPreferenceActivity.class); from.startActivityIfNeeded(intent, -1); } + //函数功能:实现对便签列表项的点击事件(短按) private class OnListItemClickListener implements OnItemClickListener { - public void onItemClick(AdapterView parent, View view, int position, long id) { if (view instanceof NotesListItem) { + //获取点击的item项的数据 NoteItemData item = ((NotesListItem) view).getItemData(); if (mNotesListAdapter.isInChoiceMode()) { if (item.getType() == Notes.TYPE_NOTE) { @@ -919,11 +984,12 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe } + //查询目标文件 private void startQueryDestinationFolders() { String selection = NoteColumns.TYPE + "=? AND " + NoteColumns.PARENT_ID + "<>? AND " + NoteColumns.ID + "<>?"; selection = (mState == ListEditState.NOTE_LIST) ? selection: "(" + selection + ") OR (" + NoteColumns.ID + "=" + Notes.ID_ROOT_FOLDER + ")"; - + //后台查询程序进行查询 mBackgroundQueryHandler.startQuery(FOLDER_LIST_QUERY_TOKEN, null, Notes.CONTENT_NOTE_URI, @@ -937,6 +1003,12 @@ public class NotesListActivity extends AppCompatActivity implements OnClickListe NoteColumns.MODIFIED_DATE + " DESC"); } + /* (non-Javadoc) + * @see android.widget.AdapterView.OnItemLongClickListener#onItemLongClick(android.widget.AdapterView, android.view.View, int, long) + * 长按某一项时进行的操作 + * 如果长按的是便签,则通过ActionMode菜单实现;如果长按的是文件夹,则通过ContextMenu菜单实现; + * 具体ActionMOde菜单和ContextMenu菜单的详细见精度笔记 + */ public boolean onItemLongClick(AdapterView parent, View view, int position, long id) { if (view instanceof NotesListItem) { mFocusNoteDataItem = ((NotesListItem) view).getItemData(); diff --git a/src/MiNote/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java b/src/MiNote/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java index 51c9cb9..3eb48a9 100644 --- a/src/MiNote/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java +++ b/src/MiNote/app/src/main/java/net/micode/notes/ui/NotesListAdapter.java @@ -30,56 +30,75 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; - +/* + 功能:直译为便签表适配器,继承了CursorAdapter,它为cursor和ListView提供了连接的桥梁。 + 所以NotesListAdapter实现的是鼠标和编辑便签链接的桥梁 +*/ public class NotesListAdapter extends CursorAdapter { private static final String TAG = "NotesListAdapter"; private Context mContext; private HashMap mSelectedIndex; + //便签数 private int mNotesCount; + //选择模式标记 private boolean mChoiceMode; - + //桌面widget的属性,包括编号和类型 public static class AppWidgetAttribute { public int widgetId; public int widgetType; }; + //函数功能:初始化便签适配器 + //函数实现:根据传进来的内容设置相关变量 public NotesListAdapter(Context context) { + //父类对象置空 super(context, null); + //新建选项下表的hash表 mSelectedIndex = new HashMap(); mContext = context; mNotesCount = 0; } @Override + /*函数功能:新建一个视图来存储光标所指向的数据 + *函数实现:使用兄弟类NotesListItem新建一个项目选项*/ public View newView(Context context, Cursor cursor, ViewGroup parent) { return new NotesListItem(context); } @Override + //函数功能:将已经存在的视图和鼠标指向的数据进行捆绑 public void bindView(View view, Context context, Cursor cursor) { if (view instanceof NotesListItem) { + //若view是NotesListItem的一个实例, + // 则新建一个项目选项并且用bind跟将view和鼠标,内容,便签数据捆绑在一起 NoteItemData itemData = new NoteItemData(context, cursor); ((NotesListItem) view).bind(context, itemData, mChoiceMode, isSelectedItem(cursor.getPosition())); } } - + //函数功能:设置勾选框 public void setCheckedItem(final int position, final boolean checked) { + //根据定位和是否勾选设置下标 mSelectedIndex.put(position, checked); + //在修改后刷新activity notifyDataSetChanged(); } - + //函数功能:判断单选按钮是否勾选 public boolean isInChoiceMode() { return mChoiceMode; } - + /*函数功能:设置单项选项框 + * 函数实现:重置下标并且根据参数mode设置选项*/ public void setChoiceMode(boolean mode) { mSelectedIndex.clear(); mChoiceMode = mode; } - + //函数功能:选择全部选项 public void selectAll(boolean checked) { + //获取光标位置 Cursor cursor = getCursor(); + //遍历所有光标可用的位置在判断为便签类型之后勾选单项框 for (int i = 0; i < getCount(); i++) { if (cursor.moveToPosition(i)) { if (NoteItemData.getNoteType(cursor) == Notes.TYPE_NOTE) { @@ -88,15 +107,20 @@ public class NotesListAdapter extends CursorAdapter { } } } - + //函数功能:建立选择项的下标列表 public HashSet getSelectedItemIds() { + //建立hash表 HashSet itemSet = new HashSet(); + //遍历所有的关键 for (Integer position : mSelectedIndex.keySet()) { + //若光标位置可用 if (mSelectedIndex.get(position) == true) { Long id = getItemId(position); if (id == Notes.ID_ROOT_FOLDER) { + //源文件不需要添加 Log.d(TAG, "Wrong item id, should not happen"); - } else { + } else{ + //则将id该下标加入选项集合中 itemSet.add(id); } } @@ -104,13 +128,14 @@ public class NotesListAdapter extends CursorAdapter { return itemSet; } - + //函数功能:建立桌面Widget的选项表 public HashSet getSelectedWidget() { HashSet itemSet = new HashSet(); for (Integer position : mSelectedIndex.keySet()) { if (mSelectedIndex.get(position) == true) { Cursor c = (Cursor) getItem(position); if (c != null) { + //光标位置可用的话就建立新的Widget属性并编辑下标和类型,最后添加到选项集中 AppWidgetAttribute widget = new AppWidgetAttribute(); NoteItemData item = new NoteItemData(mContext, c); widget.widgetId = item.getWidgetId(); @@ -127,12 +152,14 @@ public class NotesListAdapter extends CursorAdapter { } return itemSet; } - + //函数功能:获取选项个数 public int getSelectedCount() { + //获取选项下标的值 Collection values = mSelectedIndex.values(); if (null == values) { return 0; } + //初始化迭代器 Iterator iter = values.iterator(); int count = 0; while (iter.hasNext()) { @@ -142,41 +169,44 @@ public class NotesListAdapter extends CursorAdapter { } return count; } - + //函数功能:判断是否全部选中 public boolean isAllSelected() { int checkedCount = getSelectedCount(); + //根据选项数是否等于便签的个数判断 return (checkedCount != 0 && checkedCount == mNotesCount); } - + //函数功能:判断是否为选项表 public boolean isSelectedItem(final int position) { if (null == mSelectedIndex.get(position)) { return false; } return mSelectedIndex.get(position); } - + //函数功能:在activity内容发生局部变动的时候回调该函数计算便签的数量 @Override protected void onContentChanged() { super.onContentChanged(); calcNotesCount(); } - + //函数功能:在activity内容发生局部变动的时候回调该函数计算便签的数量 @Override public void changeCursor(Cursor cursor) { super.changeCursor(cursor); calcNotesCount(); } - + //函数功能:计算便签数量 private void calcNotesCount() { mNotesCount = 0; + //获取总数同时遍历 for (int i = 0; i < getCount(); i++) { Cursor c = (Cursor) getItem(i); + //若该位置不为空并且文本类型为便签就+1 if (c != null) { if (NoteItemData.getNoteType(c) == Notes.TYPE_NOTE) { mNotesCount++; } } else { - Log.e(TAG, "Invalid cursor"); + Log.e(TAG, "该列表项不是便签,不计入便签数"); return; } }