/* * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.micode.notes.ui; import android.content.Context; import android.database.Cursor; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.CursorAdapter; import net.micode.notes.data.Notes; import java.util.Collection; 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);//父类对象置空 mSelectedIndex = new HashMap();//新建选项下标的hash表 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的一个实例 NoteItemData itemData = new NoteItemData(context, cursor); ((NotesListItem) view).bind(context, itemData, mChoiceMode, isSelectedItem(cursor.getPosition())); //则新建一个项目选项并且用bind跟将view和鼠标、内容、便签数据捆绑在一起 } } /* 函数功能:设置勾选框 */ public void setCheckedItem(final int position, final boolean checked) { mSelectedIndex.put(position, checked);//根据定位和是否勾选设置下标 notifyDataSetChanged();//在修改后刷新activity } /* 函数功能:判断单选按钮是否勾选 */ 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) { setCheckedItem(i, checked); } } } //遍历所有光标可用的位置在判断为便签类型之后勾选单项框 } /* 建立选择项的下标列表 */ public HashSet getSelectedItemIds() { HashSet itemSet = new HashSet();//建立hash表 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 { itemSet.add(id); } //则将id下标加入选项集合中 } } 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); //以上4句和getSelectedItemIds一样 if (c != null) {//若光标位置可用就建立新的widget属性并编辑下表和类型,最后添加到选项集中 AppWidgetAttribute widget = new AppWidgetAttribute(); NoteItemData item = new NoteItemData(mContext, c); widget.widgetId = item.getWidgetId(); widget.widgetType = item.getWidgetType(); itemSet.add(widget); /** * Don't close cursor here, only the adapter could close it */ } else { Log.e(TAG, "Invalid cursor"); return null; } } } return itemSet; } /* 函数功能:获取选项个数 */ public int getSelectedCount() { Collection values = mSelectedIndex.values();//首先获取选项下标的值 if (null == values) { return 0; } Iterator iter = values.iterator();//初始化叠加器 int count = 0; while (iter.hasNext()) { if (true == iter.next()) { //若value值为真,计数+1 count++; } } 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); } @Override /* 函数功能:在activity内容发生局部变动的时候回调该函数计算便签的数量 */ protected void onContentChanged() { super.onContentChanged(); //执行基类函数 calcNotesCount(); } @Override /* 函数功能:在activity光标发生局部变动的时候回调该函数计算便签的数量 */ 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); if (c != null) { if (NoteItemData.getNoteType(c) == Notes.TYPE_NOTE) { mNotesCount++; //若该位置不为空并且文本类型为便签就+1 } } else { Log.e(TAG, "Invalid cursor"); return; } //否则报错 } } }