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.
xiaomi/src/ui/NotesListItem.java

184 lines
7.9 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.

/*
* 版权所有 (c) 2010-2011MiCode 开源社区 (www.micode.net)
* 根据 Apache 许可证 2.0 版本("许可证")授权;
* 除非符合许可证的规定,否则不得使用本文件。
* 您可以从以下网址获取许可证副本:
* http://www.apache.org/licenses/LICENSE-2.0
* 除非适用法律要求或书面同意,本软件按"原样"分发,
* 没有任何明示或暗示的保证或条件。
* 详见许可证中规定的权限和限制。
* 这是一份标准的Apache许可证2.0版本的开源声明)
*/
// 声明当前Java文件所在的包路径net.micode.notes.ui 表示笔记应用的UI层
package net.micode.notes.ui;
// Android注解库@SuppressLint用于忽略特定Lint警告
import android.annotation.SuppressLint;
// Android上下文类提供应用环境信息和访问系统服务
import android.content.Context;
// Android日期/时间格式化工具类,用于友好显示时间
import android.text.format.DateUtils;
// Android基础视图类所有UI组件的基类
import android.view.View;
// 复选框控件,用于多选操作
import android.widget.CheckBox;
// 图片视图控件,用于显示图标
import android.widget.ImageView;
// 线性布局容器,用于水平或垂直排列子视图
import android.widget.LinearLayout;
// 文本视图控件,用于显示文字内容
import android.widget.TextView;
// 导入应用R资源文件自动生成包含所有资源ID
import net.micode.notes.R;
// 导入笔记数据模型和常量定义
import net.micode.notes.data.Notes;
// 导入数据工具类,提供数据处理方法
import net.micode.notes.tool.DataUtils;
// 导入笔记项背景资源定义类
import net.micode.notes.tool.ResourceParser.NoteItemBgResources;
/**
* 自定义笔记列表项视图组件
* 继承自LinearLayout展示单条笔记/文件夹的完整信息
*/
public class NotesListItem extends LinearLayout {
// 提醒图标(显示时钟或通话记录图标)
private final ImageView mAlert;
// 标题/内容文本视图
private final TextView mTitle;
// 时间文本视图(显示相对时间)
private final TextView mTime;
// 通话记录联系人名称(仅通话记录可见)
private final TextView mCallName;
// 当前绑定的笔记数据对象
private NoteItemData mItemData;
// 多选模式下的复选框
private final CheckBox mCheckBox;
/**
* 构造函数
* @param context 上下文环境
*/
public NotesListItem(Context context) {
super(context);
// 加载布局文件R.layout.note_item )到当前视图
inflate(context, R.layout.note_item, this);
// 初始化视图组件
mAlert = findViewById(R.id.iv_alert_icon); // 提醒图标
mTitle = findViewById(R.id.tv_title); // 标题文本
mTime = findViewById(R.id.tv_time); // 时间文本
mCallName = findViewById(R.id.tv_name); // 联系人名称
mCheckBox = findViewById(android.R.id.checkbox);// 多选复选框
}
/**
* 绑定数据到视图
* @param context 上下文
* @param data 笔记数据对象
* @param choiceMode 是否处于多选模式
* @param checked 是否被选中
*/
@SuppressLint("SetTextI18n") // 忽略国际化的Lint警告
public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) {
// 处理多选模式显示逻辑
if (choiceMode && data.getType() == Notes.TYPE_NOTE) {
mCheckBox.setVisibility(View.VISIBLE); // 显示复选框
mCheckBox.setChecked(checked); // 设置选中状态
} else {
mCheckBox.setVisibility(View.GONE); // 隐藏复选框
}
mItemData = data; // 保存数据引用
// 判断笔记类型并设置不同显示样式
if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) {
// 通话记录文件夹的特殊处理
mCallName.setVisibility(View.GONE); // 隐藏联系人名称
mAlert.setVisibility(View.VISIBLE); // 显示提醒图标
// 设置标题样式和内容
mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);
mTitle.setText(context.getString(R.string.call_record_folder_name)
+ context.getString(R.string.format_folder_files_count, data.getNotesCount()));
mAlert.setImageResource(R.drawable.call_record); // 设置通话记录图标
} else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) {
// 通话记录笔记的特殊处理
mCallName.setVisibility(View.VISIBLE); // 显示联系人名称
mCallName.setText(data.getCallName()); // 设置联系人名称
// 设置次级标题样式
mTitle.setTextAppearance(context, R.style.TextAppearanceSecondaryItem);
mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); // 设置内容摘要
// 处理提醒图标显示
if (data.hasAlert()) {
mAlert.setImageResource(R.drawable.clock); // 设置时钟图标
mAlert.setVisibility(View.VISIBLE);
} else {
mAlert.setVisibility(View.GONE);
}
} else {
// 普通笔记/文件夹的处理
mCallName.setVisibility(View.GONE); // 隐藏联系人名称
// 设置主标题样式
mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);
if (data.getType() == Notes.TYPE_FOLDER) {
// 文件夹的特殊处理
mTitle.setText(data.getSnippet() + context.getString(R.string.format_folder_files_count,
data.getNotesCount())); // 显示文件夹名+笔记数
mAlert.setVisibility(View.GONE); // 隐藏提醒图标
} else {
// 普通笔记的处理
mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); // 设置内容摘要
// 处理提醒图标显示
if (data.hasAlert()) {
mAlert.setImageResource(R.drawable.clock); // 设置时钟图标
mAlert.setVisibility(View.VISIBLE);
} else {
mAlert.setVisibility(View.GONE);
}
}
}
// 设置相对时间显示(如"2分钟前"
mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));
// 设置背景样式
setBackground(data);
}
/**
* 根据笔记位置设置不同背景样式
* @param data 笔记数据对象
*/
private void setBackground(NoteItemData data) {
int id = data.getBgColorId(); // 获取背景颜色ID
if (data.getType() == Notes.TYPE_NOTE) {
// 笔记项的背景处理
if (data.isSingle() || data.isOneFollowingFolder()) {
// 单一项或紧接文件夹的项
setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id));
} else if (data.isLast()) {
// 最后一项
setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id));
} else if (data.isFirst() || data.isMultiFollowingFolder()) {
// 第一项或跟随多文件夹的项
setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id));
} else {
// 普通中间项
setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id));
}
} else {
// 文件夹项的背景
setBackgroundResource(NoteItemBgResources.getFolderBgRes());
}
}
/**
* 获取当前绑定的笔记数据
* @return 笔记数据对象
*/
public NoteItemData getItemData() {
return mItemData;
}
}