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