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

179 lines
15 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)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* 按照许可要求使用此文件,否则不允许使用。
* 可以通过以下网址获取许可证副本:
* http://www.apache.org/licenses/LICENSE-2.0
*
* 除非适用法律要求或书面同意,软件依据许可证分发是“按现状”分发,
* 不附带任何明示或暗示的保证或条件。请查看许可证了解具体权限和限制。
*/
// 所在包声明表明该类属于笔记应用net.micode.notes的用户界面ui相关模块。
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;
// NotesListItem类继承自LinearLayout代表笔记列表中的每一个列表项视图负责展示笔记相关的各种信息如标题、时间、提醒图标等
// 并根据不同的笔记类型(如普通笔记、通话记录文件夹、普通文件夹等)以及是否处于多选模式等情况来调整显示内容和样式。
public class NotesListItem extends LinearLayout {
// 用于显示提醒图标的ImageView控件根据笔记是否设置提醒等情况来决定其显示与否以及显示的图标资源帮助用户直观了解笔记的提醒状态。
private ImageView mAlert;
// 用于显示笔记标题的TextView控件会根据笔记类型等因素展示不同格式的标题内容比如普通笔记展示摘要内容文件夹展示文件夹名称及包含文件数量等。
private TextView mTitle;
// 用于显示笔记最后修改时间的TextView控件通过调用DateUtils工具类将时间戳转换为相对时间格式如“几分钟前”“昨天”等进行展示方便用户了解笔记的更新情况。
private TextView mTime;
// 用于显示通话记录相关名称的TextView控件在涉及通话记录的笔记项中展示通话对方名称等信息在其他类型笔记项中通常设置为不可见。
private TextView mCallName;
// 用于存储当前列表项对应的笔记数据对象,方便在其他方法中获取笔记的详细信息来进行展示和逻辑处理,比如获取笔记类型、是否有提醒等属性。
private NoteItemData mItemData;
// 用于表示笔记项是否被选中的CheckBox控件在多选模式下根据笔记项的选中状态显示勾选与否非多选模式下则隐藏该控件用于用户进行多选操作的可视化交互。
private CheckBox mCheckBox;
// 构造方法接收一个Context上下文对象调用父类LinearLayout的构造方法传入上下文然后通过inflate方法加载指定的布局文件R.layout.note_item到当前视图中
// 最后通过findViewById方法找到布局文件中对应的各个子视图控件如ImageView、TextView、CheckBox等并赋值给相应的成员变量完成视图的初始化工作。
public NotesListItem(Context context) {
super(context);
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);
}
// 用于绑定数据和设置视图显示状态的方法,接收上下文对象、笔记数据对象、是否处于多选模式的布尔值以及当前笔记项是否被选中的布尔值作为参数,
// 根据这些参数来调整视图中各个控件的显示内容和可见性等状态,使得笔记项能够正确展示对应笔记的数据信息以及符合当前交互模式(多选或非多选)的外观效果。
public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) {
// 如果处于多选模式且当前笔记数据对象的类型为普通笔记Notes.TYPE_NOTE则将CheckBox控件设置为可见并根据传入的选中状态参数设置其勾选状态
// 以便用户能看到该笔记项是否已被选中否则将CheckBox控件隐藏例如在非多选模式或者对于非笔记类型的数据项不需要显示选中状态。
if (choiceMode && data.getType() == Notes.TYPE_NOTE) {
mCheckBox.setVisibility(View.VISIBLE);
mCheckBox.setChecked(checked);
} else {
mCheckBox.setVisibility(View.GONE);
}
// 将传入的笔记数据对象赋值给成员变量mItemData方便后续在其他方法中获取该笔记的详细信息进行处理例如设置背景等操作需要用到笔记相关属性。
mItemData = data;
// 如果当前笔记数据对象的ID等于通话记录文件夹的IDNotes.ID_CALL_RECORD_FOLDER说明当前列表项对应的是通话记录文件夹
// 则进行如下设置:
if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) {
// 隐藏用于显示通话名称的TextView控件因为通话记录文件夹不需要显示通话对方名称。
mCallName.setVisibility(View.GONE);
// 设置提醒图标ImageView为可见用于展示通话记录文件夹对应的特定图标通常用于区分不同类型的文件夹等
mAlert.setVisibility(View.VISIBLE);
// 设置标题TextView的文本外观样式为主要项的样式通过资源ID指定R.style.TextAppearancePrimaryItem使其在视觉上突出显示。
mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);
// 设置标题TextView的文本内容拼接通话记录文件夹的名称字符串通过资源字符串获取以及包含的文件数量信息通过格式化字符串展示调用getString和format_folder_files_count方法
// 让用户直观了解通话记录文件夹的基本情况。
mTitle.setText(context.getString(R.string.call_record_folder_name)
+ context.getString(R.string.format_folder_files_count, data.getNotesCount()));
// 设置提醒图标ImageView的资源图片为通话记录对应的图标R.drawable.call_record使其显示正确的图标样式来代表通话记录文件夹。
mAlert.setImageResource(R.drawable.call_record);
}
// 如果当前笔记数据对象的父ID等于通话记录文件夹的IDNotes.ID_CALL_RECORD_FOLDER说明当前列表项对应的是通话记录文件夹下的笔记
// 则进行如下设置:
else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) {
// 显示用于显示通话名称的TextView控件并设置其文本内容为笔记数据中获取的通话对方名称以便展示通话相关的具体信息。
mCallName.setVisibility(View.VISIBLE);
mCallName.setText(data.getCallName());
// 设置标题TextView的文本外观样式为次要项的样式通过资源ID指定R.style.TextAppearanceSecondaryItem使其与主要项如文件夹标题等在视觉上有所区分。
mTitle.setTextAppearance(context, R.style.TextAppearanceSecondaryItem);
// 设置标题TextView的文本内容为格式化后的笔记摘要信息通过DataUtils工具类的getFormattedSnippet方法获取格式化后的摘要内容展示笔记的主要内容摘要。
mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));
// 如果笔记数据对象表示有提醒设置通过hasAlert方法判断则设置提醒图标ImageView为可见并设置其图片资源为提醒对应的图标R.drawable.clock展示提醒状态
// 否则将提醒图标ImageView隐藏表示无提醒设置。
if (data.hasAlert()) {
mAlert.setImageResource(R.drawable.clock);
mAlert.setVisibility(View.VISIBLE);
} else {
mAlert.setVisibility(View.GONE);
}
}
// 如果当前笔记数据对象既不是通话记录文件夹也不是其下的笔记(即其他普通类型的笔记或文件夹等情况),则进行如下设置:
else {
// 隐藏用于显示通话名称的TextView控件因为不需要展示通话相关信息。
mCallName.setVisibility(View.GONE);
// 设置标题TextView的文本外观样式为主要项的样式通过资源ID指定R.style.TextAppearancePrimaryItem使其在视觉上突出显示。
mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);
// 如果笔记数据对象的类型是文件夹Notes.TYPE_FOLDER则设置标题TextView的文本内容为文件夹的摘要信息通过getSnippet方法获取拼接包含的文件数量信息通过格式化字符串展示
// 展示文件夹名称及其中包含的笔记数量情况同时将提醒图标ImageView隐藏因为文件夹通常不需要展示提醒相关图标。
if (data.getType() == Notes.TYPE_FOLDER) {
mTitle.setText(data.getSnippet()
+ context.getString(R.string.format_folder_files_count,
data.getNotesCount()));
mAlert.setVisibility(View.GONE);
}
// 如果笔记数据对象的类型是普通笔记非文件夹类型则设置标题TextView的文本内容为格式化后的笔记摘要信息通过DataUtils工具类的getFormattedSnippet方法获取格式化后的摘要内容展示笔记的主要内容摘要
// 并且根据笔记是否有提醒设置通过hasAlert方法判断来决定提醒图标ImageView的显示与否及显示的图标资源有提醒则显示提醒图标无提醒则隐藏与前面处理类似。
else {
mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));
if (data.hasAlert()) {
mAlert.setImageResource(R.drawable.clock);
mAlert.setVisibility(View.VISIBLE);
} else {
mAlert.setVisibility(View.GONE);
}
}
}
// 设置用于显示时间的TextView控件的文本内容通过DateUtils工具类的getRelativeTimeSpanString方法将笔记数据中的最后修改时间戳转换为相对时间格式的字符串进行展示
// 方便用户直观了解笔记的最近更新时间情况。
mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));
// 调用setBackground方法根据笔记数据对象来设置当前列表项的背景样式使得不同类型的笔记或文件夹等在界面上能有不同的背景视觉效果增强区分度和美观性。
setBackground(data);
}
// 私有方法,用于根据笔记数据对象来设置当前列表项的背景资源样式,根据笔记类型以及其在列表中的位置等相关属性来选择合适的背景资源进行设置,
// 以实现不同笔记项在界面上展示不同的背景效果,例如普通笔记可能根据是否为首尾项、是否单独等情况设置不同背景,文件夹则统一设置对应的文件夹背景样式。
private void setBackground(NoteItemData data) {
int id = data.getBgColorId();
// 如果笔记数据对象的类型是普通笔记Notes.TYPE_NOTE则根据笔记在列表中的位置等相关属性进一步判断来设置不同的背景资源
if (data.getType() == Notes.TYPE_NOTE) {
// 如果笔记是单独的可能是列表中唯一的一个笔记或者与前后笔记在某些逻辑上是独立的通过isSingle方法判断或者是某个文件夹后的单独一个笔记通过isOneFollowingFolder方法判断
// 则设置当前列表项的背景资源为对应单独笔记的背景资源通过NoteItemBgResources工具类的getNoteBgSingleRes方法获取资源ID并设置使其有特定的视觉效果。
if (data.isSingle() || data.isOneFollowingFolder()) {
setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id));
}
// 如果笔记是列表中的最后一个笔记通过isLast方法判断则设置当前列表项的背景资源为对应最后一个笔记的背景资源通过NoteItemBgResources工具类的getNoteBgLastRes方法获取资源ID并设置展示相应的外观效果。
else if (data.isLast()) {
setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id));
}
// 如果笔记是列表中的第一个笔记通过isFirst方法判断或者是某个文件夹后的多个笔记中的第一个通过isMultiFollowingFolder方法判断
// 则设置当前列表项的背景资源为对应第一个笔记的背景资源通过NoteItemBgResources工具类的getNoteBgFirstRes方法获取资源ID并设置呈现对应的视觉样式。
else if (data.isFirst() || data.isMultiFollowingFolder()) {
setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id));
}
// 如果笔记不属于上述几种特殊位置情况即普通的中间笔记则设置当前列表项的背景资源为普通笔记的默认背景资源通过NoteItemBgResources工具类的getNoteBgNormalRes方法获取资源ID并设置保持统一的视觉效果。
else {
setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id));
}
}
// 如果笔记数据对象的类型不是普通笔记即文件夹等其他类型则统一设置当前列表项的背景资源为文件夹对应的背景资源通过NoteItemBgResources工具类的getFolderBgRes方法获取资源ID并设置
// 使得文件夹在界面上有统一的外观样式与普通笔记区分开来。
else {
setBackgroundResource(NoteItemBgResources.getFolderBgRes());
}
}
// 用于获取当前列表项对应的笔记数据对象的方法,外部代码可以通过调用该方法获取到绑定在该列表项上的笔记详细信息,方便进行其他相关的逻辑处理或数据传递操作。
public NoteItemData getItemData() {
return mItemData;
}
}