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.
pk2/src/net/micode/notes/ui/NotesListItem.java

183 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");
* 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.
*/
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控件通常会展示笔记的修改时间等并以相对时间的格式如“几分钟前”“昨天”等进行显示。
private TextView mTime;
// 用于显示与笔记相关的联系人姓名如果笔记属于通话记录等相关情况的TextView控件若不涉及则可能隐藏该控件。
private TextView mCallName;
// 用于存储当前列表项对应的笔记数据对象NoteItemData类型包含了笔记的各种详细信息方便在视图设置等操作中获取对应的数据进行展示和判断。
private NoteItemData mItemData;
// 用于在选择模式下例如多选操作时显示选择状态的CheckBox控件根据是否处于选择模式以及笔记类型等情况决定其可见性和选中状态。
private CheckBox mCheckBox;
// 构造函数接收上下文Context作为参数调用父类LinearLayout的构造函数进行初始化
// 并通过inflate方法加载对应的布局文件R.layout.note_item到当前视图中然后获取布局中各个相关的子控件实例。
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) {
// 如果处于选择模式choiceMode为true并且笔记类型是普通笔记Notes.TYPE_NOTE则显示CheckBox控件
// 并根据传入的是否已选中参数checked设置其选中状态用于在多选等操作场景下展示选择情况。
if (choiceMode && data.getType() == Notes.TYPE_NOTE) {
mCheckBox.setVisibility(View.VISIBLE);
mCheckBox.setChecked(checked);
} else {
// 如果不满足上述条件非选择模式或者不是普通笔记类型则隐藏CheckBox控件不展示选择相关操作界面。
mCheckBox.setVisibility(View.GONE);
}
// 将传入的笔记数据对象赋值给成员变量mItemData方便后续在其他方法中获取该笔记的各项详细信息。
mItemData = data;
// 如果笔记的ID等于通话记录文件夹的特定IDNotes.ID_CALL_RECORD_FOLDER说明当前列表项对应的是通话记录文件夹进行以下设置
if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) {
// 隐藏显示联系人姓名的TextView控件mCallName因为通话记录文件夹本身不需要显示联系人姓名。
mCallName.setVisibility(View.GONE);
// 显示提醒图标相关的ImageView控件mAlert可能用于表示该文件夹有特殊含义或者相关提醒功能具体取决于业务逻辑
mAlert.setVisibility(View.VISIBLE);
// 设置标题mTitle的文本外观样式为主要项的样式通过R.style.TextAppearancePrimaryItem资源样式设置使其在界面上以相应的样式展示。
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显示的图片资源为通话记录相关的特定图标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并设置其文本内容为笔记相关的联系人姓名通过笔记数据中的联系人姓名信息获取展示给用户对应的联系人信息。
mCallName.setVisibility(View.VISIBLE);
mCallName.setText(data.getCallName());
// 设置标题mTitle的文本外观样式为次要项的样式通过R.style.TextAppearanceSecondaryItem资源样式设置使其与文件夹等其他项在样式上有所区分展示。
mTitle.setTextAppearance(context,R.style.TextAppearanceSecondaryItem);
// 设置标题的文本内容为经过格式化后的笔记摘要信息通过DataUtils工具类的方法对笔记数据中的摘要内容进行格式化处理获取展示笔记的简要内容。
mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));
// 如果笔记设置了提醒通过笔记数据中的提醒日期判断hasAlert方法返回true则进行以下提醒图标相关设置
if (data.hasAlert()) {
// 设置提醒图标mAlert显示的图片资源为闹钟图标R.drawable.clock直观提示用户该笔记设置了提醒功能。
mAlert.setImageResource(R.drawable.clock);
// 显示提醒图标相关的ImageView控件mAlert使其在界面上可见。
mAlert.setVisibility(View.VISIBLE);
} else {
// 如果笔记没有设置提醒则隐藏提醒图标相关的ImageView控件mAlert不在界面上展示该图标。
mAlert.setVisibility(View.GONE);
}
}
// 如果笔记不属于上述通话记录文件夹相关的情况,则进行以下通用设置:
else {
// 隐藏联系人姓名的TextView控件mCallName因为该笔记与通话记录无关不需要展示联系人姓名。
mCallName.setVisibility(View.GONE);
// 设置标题mTitle的文本外观样式为主要项的样式通过R.style.TextAppearancePrimaryItem资源样式设置以相应的样式展示标题内容。
mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem);
// 如果笔记类型是文件夹类型Notes.TYPE_FOLDER进行以下文件夹相关的标题设置
if (data.getType() == Notes.TYPE_FOLDER) {
// 设置标题的文本内容为笔记的摘要信息(通过笔记数据中的摘要内容获取)加上该文件夹内文件数量(通过格式化字符串资源结合笔记数据中的文件数量信息获取),展示文件夹及其包含文件数量的相关信息给用户。
mTitle.setText(data.getSnippet()
+ context.getString(R.string.format_folder_files_count,
data.getNotesCount()));
// 隐藏提醒图标相关的ImageView控件mAlert文件夹通常不需要展示提醒图标除非有特殊业务逻辑要求
mAlert.setVisibility(View.GONE);
} else {
// 如果笔记不是文件夹类型即普通笔记等其他类型设置标题的文本内容为经过格式化后的笔记摘要信息通过DataUtils工具类的方法对笔记数据中的摘要内容进行格式化处理获取展示笔记的简要内容。
mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet()));
// 如果笔记设置了提醒通过笔记数据中的提醒日期判断hasAlert方法返回true则进行以下提醒图标相关设置
if (data.hasAlert()) {
// 设置提醒图标mAlert显示的图片资源为闹钟图标R.drawable.clock直观提示用户该笔记设置了提醒功能。
mAlert.setImageResource(R.drawable.clock);
// 显示提醒图标相关的ImageView控件mAlert使其在界面上可见。
mAlert.setVisibility(View.VISIBLE);
} else {
// 如果笔记没有设置提醒则隐藏提醒图标相关的ImageView控件mAlert不在界面上展示该图标。
mAlert.setVisibility(View.GONE);
}
}
}
// 设置显示时间的TextView控件mTime的文本内容通过DateUtils工具类的方法将笔记的修改日期通过笔记数据中的修改日期信息获取转换为相对时间格式的字符串如“几分钟前”“昨天”等进行展示方便用户直观了解笔记的修改时间情况。
mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate()));
// 调用setBackground方法根据笔记数据中的背景颜色ID以及笔记的类型、位置等状态信息设置当前列表项的背景样式使其在列表中以合适的背景展示。
setBackground(data);
}
// 私有方法根据笔记数据NoteItemData类型中的背景颜色ID以及笔记的类型、位置等状态信息
// 通过NoteItemBgResources工具类获取对应的背景资源并设置为当前列表项的背景实现不同情况下的差异化背景展示。
private void setBackground(NoteItemData data) {
int id = data.getBgColorId();
// 如果笔记类型是普通笔记Notes.TYPE_NOTE根据笔记在列表中的不同位置、数量等情况设置不同的背景资源
if (data.getType() == Notes.TYPE_NOTE) {
// 如果笔记是列表中唯一的一项或者是某文件夹下仅跟随的一个笔记(通过笔记数据中的相关判断方法确定),
// 通过NoteItemBgResources工具类获取对应的单个笔记背景资源根据背景颜色ID获取具体资源ID并设置为当前列表项的背景。
if (data.isSingle() || data.isOneFollowingFolder()) {
setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id));
}
// 如果笔记是列表中的最后一项通过笔记数据中的相关判断方法确定通过NoteItemBgResources工具类获取对应的最后一个笔记背景资源根据背景颜色ID获取具体资源ID并设置为当前列表项的背景。
else if (data.isLast()) {
setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id));
}
// 如果笔记是列表中的第一项或者是某文件夹下跟随的多个笔记之一(通过笔记数据中的相关判断方法确定),
// 通过NoteItemBgResources工具类获取对应的第一个笔记或多个笔记中某个的背景资源根据背景颜色ID获取具体资源ID并设置为当前列表项的背景。
else if (data.isFirst() || data.isMultiFollowingFolder()) {
setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id));
} else {
// 如果笔记不属于上述特殊位置等情况则通过NoteItemBgResources工具类获取对应的普通笔记背景资源根据背景颜色ID获取具体资源ID并设置为当前列表项的背景。
setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id));
}
} else {
// 如果笔记不是普通笔记类型例如是文件夹类型等通过NoteItemBgResources工具类获取对应的文件夹背景资源并设置为当前列表项的背景以区别于普通笔记的背景展示。
setBackgroundResource(NoteItemBgResources.getFolderBgRes());
}
}
// 对外提供获取当前列表项对应的笔记数据对象的方法,外部可调用此方法获取笔记的详细信息,例如在点击列表项等操作后,
// 通过获取笔记数据进一步进行查看详情、编辑等相关业务逻辑处理。
public NoteItemData getItemData() {
return mItemData;
}
}