/* * 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等于通话记录文件夹的ID(Notes.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等于通话记录文件夹的ID(Notes.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; } }