You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2Q1/ui/FoldersListAdapter.java

121 lines
10 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
* Copyright (c) 2010 - 2011, The MiCode Open Source Community (www.micode.net)
* 版权声明部分表明该代码遵循Apache License 2.0协议,同时说明了版权所属的开源社区以及相关许可的获取途径等信息。
*/
/*
* 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.
*/
// 声明该类所属的包名表明这个类位于net.micode.notes.ui包下在项目的整体包结构中有其特定的组织和访问层级关系。
package net.micode.notes.ui;
// 导入必要的Android系统相关类Context用于获取应用的上下文环境信息是很多Android操作如资源获取、系统服务调用等的基础。
// Cursor用于处理数据库查询结果集通过它可以遍历查询返回的数据记录等操作。
import android.content.Context;
import android.database.Cursor;
// 导入View和ViewGroup相关类View是Android中所有可视化组件的基类ViewGroup是可以包含其他子视图的视图容器类用于构建复杂的UI布局结构。
import android.view.View;
import android.view.ViewGroup;
// 导入CursorAdapter类这是Android中用于将数据库查询结果Cursor与ListView等列表视图进行适配的抽象类子类需要实现特定方法来定制数据展示逻辑。
import android.widget.CursorAdapter;
// 导入LinearLayout类用于创建线性布局是一种常见的布局方式可以按照水平或垂直方向排列子视图。
import android.widget.LinearLayout;
// 导入TextView类用于在界面上展示文本信息是显示文字内容的常用组件。
import android.widget.TextView;
// 导入项目中自动生成的资源类R通过它可以访问项目中的各种资源如布局文件、图片资源、字符串资源等这里主要用于获取特定的字符串资源和布局文件资源。
// 同时导入了与数据相关的类Notes以及Notes类中的NoteColumns内部类用于处理笔记数据相关的操作比如获取数据列信息等。
import net.micode.notes.R;
import net.micode.notes.data.Notes;
import net.micode.notes.data.Notes.NoteColumns;
// FoldersListAdapter类继承自CursorAdapter抽象类主要用于将数据库查询到的文件夹相关数据以Cursor形式表示适配到列表视图中进行展示
// 并且提供了获取文件夹名称以及定制列表项视图显示内容等功能方便在Android应用中展示文件夹列表信息。
public class FoldersListAdapter extends CursorAdapter {
// 定义一个字符串数组常量PROJECTION用于指定从数据库查询时需要获取的列信息这里只包含了NoteColumns.ID可能是文件夹的唯一标识符列和NoteColumns.SNIPPET可能是文件夹相关的简短描述等信息列
public static final String [] PROJECTION = {
NoteColumns.ID,
NoteColumns.SNIPPET
};
// 定义一个常量ID_COLUMN表示在PROJECTION数组中ID列的索引位置这里初始化为0方便后续通过索引快速获取对应列的数据。
public static final int ID_COLUMN = 0;
// 定义一个常量NAME_COLUMN表示在PROJECTION数组中用于显示名称的列这里实际对应NoteColumns.SNIPPET列的索引位置初始化为1用于后续按索引获取文件夹名称相关数据。
public static final int NAME_COLUMN = 1;
// FoldersListAdapter类的构造函数用于创建该适配器的实例接收一个Context类型的参数context用于获取应用的上下文环境信息
// 以及一个Cursor类型的参数c这个Cursor包含了从数据库查询出来的文件夹相关数据通过调用父类CursorAdapter的构造函数将这两个参数传递进去完成父类的初始化以及基础的适配设置工作。
public FoldersListAdapter(Context context, Cursor c) {
super(context, c);
// TODO Auto-generated constructor stub
// 这里的TODO注释通常表示此处还有待完善或者补充的代码逻辑可能后续需要根据具体业务需求进一步添加初始化相关的操作等内容。
}
// 重写CursorAdapter类中的newView方法该方法用于创建一个新的视图View对象用于在列表中展示每一项数据在这里就是每个文件夹对应的列表项视图
// 接收三个参数Context类型的context用于获取应用的上下文环境信息以便加载相关资源等Cursor类型的cursor虽然在这里未使用但在更复杂的场景下可以用于获取数据来初始化视图
// ViewGroup类型的parent表示该视图的父容器用于确定视图的布局等相关属性。在这里返回一个新创建的FolderListItem对象它是自定义的用于展示文件夹信息的列表项视图类。
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return new FolderListItem(context);
}
// 重写CursorAdapter类中的bindView方法该方法用于将数据库查询到的数据通过Cursor表示绑定到已经创建好的视图View对象上实现数据在视图上的展示。
// 接收三个参数View类型的view表示要绑定数据的视图对象这里实际上就是前面newView方法创建的FolderListItem对象Context类型的context用于获取应用的上下文环境信息
// Cursor类型的cursor包含了要绑定的数据记录。在方法内部首先判断传入的视图是否是FolderListItem类型如果是则进行如下操作
// 获取文件夹的名称通过判断当前记录中ID列的值是否等于Notes.ID_ROOT_FOLDER可能是表示根文件夹的特定标识符来决定显示的名称
// 如果是根文件夹则获取R.string.menu_move_parent_folder对应的字符串资源作为名称可能是显示“上级文件夹”之类的特定文本否则获取NAME_COLUMN列对应的字符串作为文件夹名称。
// 最后调用((FolderListItem) view).bind(folderName)方法将获取到的文件夹名称传递给FolderListItem对象的bind方法用于在对应的视图上具体是TextView组件显示文件夹名称。
@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);
}
}
// 定义一个方法用于获取指定位置的文件夹名称接收一个Context类型的参数context用于获取应用的上下文环境信息以及一个int类型的参数position表示在列表中的位置索引。
// 首先通过调用getItem方法继承自CursorAdapter类获取指定位置对应的Cursor对象包含了该位置对应的文件夹数据记录然后按照与bindView方法中类似的逻辑
// 判断该记录中ID列的值是否等于Notes.ID_ROOT_FOLDER来决定返回的文件夹名称是特定的根文件夹名称字符串从资源中获取还是从NAME_COLUMN列获取的普通文件夹名称字符串最终返回获取到的文件夹名称。
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);
}
// 定义一个内部私有类FolderListItem它继承自LinearLayout用于表示文件夹列表中的每一个列表项视图内部包含了用于显示文件夹名称的TextView组件
// 并且提供了一个bind方法用于将文件夹名称数据绑定到TextView组件上进行显示实现了列表项视图的数据展示逻辑定制。
private class FolderListItem extends LinearLayout {
// 定义一个TextView类型的成员变量mName用于存储和显示文件夹的名称是列表项视图中展示文本信息的核心组件。
private TextView mName;
// FolderListItem类的构造函数用于创建该列表项视图的实例接收一个Context类型的参数context用于获取应用的上下文环境信息以便加载相关资源等。
// 首先调用父类LinearLayout的构造函数传入上下文环境context完成父类的初始化操作确保该列表项视图能继承LinearLayout的布局属性和功能。
// 然后通过inflate方法加载名为R.layout.folder_list_item的布局文件并将其填充到当前的FolderListItem实例中也就是this所代表的当前对象
// 这个布局文件应该包含了用于展示文件夹信息的各个子控件如这里的mName对应的TextView的布局定义使得这些控件能够在界面上显示出来。
// 最后通过findViewById方法在已加载的布局中查找ID为R.id.tv_folder_name的视图控件并将其转换为TextView类型赋值给mName成员变量以便后续可以操作这个TextView来显示文件夹名称。
public FolderListItem(Context context) {
super(context);
inflate(context, R.layout.folder_list_item, this);
mName = (TextView) findViewById(R.id.tv_folder_name);
}
// 定义一个bind方法用于将传入的文件夹名称数据绑定到TextView组件mName上进行显示接收一个String类型的参数name表示要显示的文件夹名称
// 通过调用mName的setText方法将传入的名称字符串设置为TextView的显示内容从而实现在列表项视图上展示文件夹名称的功能。
public void bind(String name) {
mName.setText(name);
}
}
}