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

174 lines
7.6 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-2011The MiCode 开源社区 (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.text.format.DateUtils;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
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
* 功能:展示单个笔记/文件夹/通话记录项的UI界面支持不同类型数据的差异化展示
* 包含元素:
* - 提醒图标mAlert
* - 标题mTitle
* - 时间mTime
* - 通话联系人mCallName仅通话记录项显示
* - 多选框mCheckBox仅笔记项在多选模式下显示
*/
public class NotesListItem extends LinearLayout {
// 界面元素声明
private ImageView mAlert; // 提醒图标(闹钟/通话记录图标)
private TextView mTitle; // 标题/内容摘要
private TextView mTime; // 最后修改时间
private TextView mCallName; // 通话记录对应的联系人姓名
private NoteItemData mItemData; // 绑定的数据对象
private CheckBox mCheckBox; // 多选框(用于批量操作)
/**
* 构造方法:初始化布局
* @param context 上下文
*/
public NotesListItem(Context context) {
super(context);
// 加载列表项布局R.layout.note_item并添加到当前视图
inflate(context, R.layout.note_item, this);
// 初始化界面元素
mAlert = (ImageView) findViewById(R.id.iv_alert_icon);
mTitle = (TextView) findViewById(R.id.tv_title);
mTime = (TextView) findViewById(R.id.tv_time);
mCallName = (TextView) findViewById(R.id.tv_name);
mCheckBox = (CheckBox) findViewById(android.R.id.checkbox);
}
/**
* 绑定数据并更新界面显示
* @param context 上下文
* @param data 数据对象NoteItemData
* @param choiceMode 是否为多选模式(控制多选框显示)
* @param checked 多选框选中状态仅在choiceMode为true时有效
*/
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.style.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);
}
}
}
// 设置最后修改时间(相对时间格式,如"5分钟前"
mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));
// 设置背景样式(根据笔记类型和排列位置)
setBackground(data);
}
/**
* 设置列表项背景样式
* @param data 数据对象
*/
private void setBackground(NoteItemData data) {
int bgColorId = data.getBgColorId(); // 获取背景颜色ID
if (data.getType() == Notes.TYPE_NOTE) {
// 笔记类型,根据排列位置设置不同背景
if (data.isSingle() || data.isOneFollowingFolder()) {
// 单独项或后续仅有一个文件夹(单背景)
setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(bgColorId));
} else if (data.isLast()) {
// 最后一项(底部圆角背景)
setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(bgColorId));
} else if (data.isFirst() || data.isMultiFollowingFolder()) {
// 第一项或后续有多个文件夹(顶部圆角背景)
setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(bgColorId));
} else {
// 中间项(普通背景)
setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(bgColorId));
}
} else {
// 文件夹类型,使用统一背景
setBackgroundResource(NoteItemBgResources.getFolderBgRes());
}
}
/**
* 获取绑定的数据对象
* @return NoteItemData 数据对象
*/
public NoteItemData getItemData() {
return mItemData;
}
}