/* * 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; public class NotesListAdapter extends CursorAdapter {//Adapter作为Activity和ListView之间的适配器,将Cursor数据转换为ListView可以理解的视图格式 private static final String TAG = "NotesListAdapter"; // 日志标签 private Context mContext; // 上下文对象 private HashMap mSelectedIndex; // 选中项索引映射 private int mNotesCount; // 笔记数量(排除文件夹) private boolean mChoiceMode; // 是否处于选择模式 public static class AppWidgetAttribute { // 小部件属性类,用于存储小部件的ID和类型 public int widgetId; // 小部件ID public int widgetType; // 小部件类型 }; public NotesListAdapter(Context context) { // 构造函数,创建NotesListAdapter实例 super(context, null); mSelectedIndex = new HashMap(); // 初始化选中项映射 mContext = context; mNotesCount = 0; } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return new NotesListItem(context); // 创建新的NotesListItem } @Override public void bindView(View view, Context context, Cursor cursor) { if (view instanceof NotesListItem) { 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); // 更新选中状态 notifyDataSetChanged(); // 通知数据变化,刷新UI } public boolean isInChoiceMode() { return mChoiceMode; // 检查是否处于选择模式 } 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() {// 获取选中项的ID集合 HashSet itemSet = new HashSet(); for (Integer position : mSelectedIndex.keySet()) { if (mSelectedIndex.get(position) == true) { Long id = getItemId(position); // 获取选中项的ID if (id == Notes.ID_ROOT_FOLDER) { Log.d(TAG, "Wrong item id, should not happen"); } else { itemSet.add(id); // 添加到集合 } } } return itemSet; } 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) { AppWidgetAttribute widget = new AppWidgetAttribute(); NoteItemData item = new NoteItemData(mContext, c); widget.widgetId = item.getWidgetId(); // 获取小部件ID 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()) { 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 protected void onContentChanged() { super.onContentChanged(); calcNotesCount(); // 当内容变化时,重新计算笔记数量 } @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); if (c != null) { if (NoteItemData.getNoteType(c) == Notes.TYPE_NOTE) { // 只统计普通笔记,排除文件夹 mNotesCount++; } } else { Log.e(TAG, "Invalid cursor"); return; } } } }