/* * 版权所有 (c) 2010-2011,The MiCode Open Source Community (www.micode.net) * * 本软件根据 Apache 许可证 2.0 版("许可证")发布; * 除非符合许可证,否则不得使用此文件。 * 您可以在以下网址获取许可证副本: * * http://www.apache.org/licenses/LICENSE-2.0 * * 除非法律要求或书面同意,软件 * 根据许可证分发的内容按"原样"提供, * 不附带任何明示或暗示的保证或条件。 * 请参阅许可证,了解有关权限和限制的具体语言。 */ package net.micode.notes.ui; import android.content.Context; import android.database.Cursor; import android.view.View; import android.view.ViewGroup; import android.widget.CursorAdapter; import android.widget.LinearLayout; import android.widget.TextView; import net.micode.notes.R; import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; /** * 文件夹列表适配器(用于显示笔记文件夹列表) * 功能: * 1. 将数据库中的文件夹数据映射到列表项视图 * 2. 处理特殊文件夹(如根文件夹)的显示逻辑 * 3. 提供获取文件夹名称的接口方法 */ public class FoldersListAdapter extends CursorAdapter { // 查询投影:定义从数据库查询的字段 public static final String [] PROJECTION = { NoteColumns.ID, // 文件夹ID NoteColumns.SNIPPET // 文件夹名称(此处Snippet用作文件夹名称) }; // 列索引常量(用于快速访问Cursor中的数据) public static final int ID_COLUMN = 0; public static final int NAME_COLUMN = 1; /** * 构造方法:初始化适配器 * @param context 上下文 * @param c 包含文件夹数据的Cursor */ public FoldersListAdapter(Context context, Cursor c) { super(context, c, 0); // 调用父类构造方法,传递Cursor } /** * 创建新的列表项视图 * @param context 上下文 * @param cursor 当前数据Cursor * @param parent 父视图组 * @return 新创建的列表项视图 */ @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return new FolderListItem(context); // 创建自定义文件夹列表项视图 } /** * 将数据绑定到已创建的视图 * @param view 要绑定数据的视图 * @param context 上下文 * @param cursor 包含数据的Cursor */ @Override public void bindView(View view, Context context, Cursor cursor) { if (view instanceof FolderListItem) { // 获取文件夹名称(特殊处理根文件夹) String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context.getString(R.string.menu_move_parent_folder) // 根文件夹显示特定名称 : cursor.getString(NAME_COLUMN); // 普通文件夹显示数据库中的名称 ((FolderListItem) view).bind(folderName); // 绑定文件夹名称到视图 } } /** * 获取指定位置的文件夹名称 * @param context 上下文 * @param position 列表位置 * @return 文件夹名称 */ public String getFolderName(Context context, int position) { Cursor cursor = (Cursor) getItem(position); return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context.getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); } /** * 文件夹列表项视图(自定义LinearLayout) * 功能: * 1. 加载列表项布局 * 2. 提供绑定文件夹名称的方法 */ private class FolderListItem extends LinearLayout { private TextView mName; // 文件夹名称显示文本框 public FolderListItem(Context context) { super(context); // 加载列表项布局并添加到当前视图 inflate(context, R.layout.folder_list_item, this); mName = findViewById(R.id.tv_folder_name); // 初始化名称文本框 } /** * 绑定文件夹名称到视图 * @param name 文件夹名称 */ public void bind(String name) { mName.setText(name); // 设置文件夹名称 } } }