diff --git a/NotesListItem.java b/NotesListItem.java new file mode 100644 index 0000000..9fd411d --- /dev/null +++ b/NotesListItem.java @@ -0,0 +1,161 @@ +/* + * 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,代表了便签列表中的每一个列表项视图,负责将便签相关的数据展示在对应的UI元素上, +// 包括标题、时间、提醒图标、联系人姓名等信息,并根据不同的便签类型、状态等设置相应的显示样式和背景。 +public class NotesListItem extends LinearLayout { + + // 用于显示提醒图标的ImageView组件,根据便签是否有提醒等情况来决定其显示与否以及显示的图标资源。 + private ImageView mAlert; + // 用于显示便签标题的TextView组件,展示便签的主要内容摘要或者文件夹名称等信息,会根据不同的便签类型和状态设置合适的文本样式和内容。 + private TextView mTitle; + // 用于显示便签相关时间信息(如修改时间)的TextView组件,通过格式化处理将时间戳转换为相对时间的文本展示给用户。 + private TextView mTime; + // 用于显示联系人姓名(如果便签与通话记录等相关)的TextView组件,在对应的业务场景下展示相关联系人的名字。 + private TextView mCallName; + // 用于存储当前列表项对应的便签数据对象,方便在其他方法中获取便签的各项属性来进行界面元素的设置和判断逻辑。 + private NoteItemData mItemData; + // 用于在多选模式下显示选择状态的CheckBox组件,根据是否处于多选模式以及当前便签类型等条件来控制其显示和选中状态。 + private CheckBox mCheckBox; + + // 构造函数,接收上下文对象作为参数,调用父类构造函数初始化,然后通过`inflate`方法将布局文件(`R.layout.note_item`)填充到当前的LinearLayout中, + // 并找到布局中的各个UI组件实例,方便后续进行数据绑定和操作。 + 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); + } + + // 用于将便签数据绑定到列表项的各个UI组件上进行展示,根据便签的类型、是否处于多选模式以及是否有提醒等不同情况,设置相应组件的显示状态、文本内容、图标资源等信息, + // 同时还会调用`setBackground`方法根据便签的状态设置合适的背景样式。 + public void bind(Context context, NoteItemData data, boolean choiceMode, boolean checked) { + // 如果处于多选模式且当前便签类型为普通便签(`Notes.TYPE_NOTE`),则显示CheckBox组件,并根据传入的选中状态参数设置其选中状态。 + if (choiceMode && data.getType() == Notes.TYPE_NOTE) { + mCheckBox.setVisibility(View.VISIBLE); + mCheckBox.setChecked(checked); + } else { + // 否则隐藏CheckBox组件,例如在非多选模式或者不是普通便签类型时不需要显示选择框。 + mCheckBox.setVisibility(View.GONE); + } + + // 将传入的便签数据对象赋值给成员变量,方便后续在其他方法中获取便签的各项属性信息进行操作。 + mItemData = data; + + // 如果便签的ID是通话记录文件夹的ID(`Notes.ID_CALL_RECORD_FOLDER`),进行以下针对通话记录文件夹类型的UI设置。 + if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { + // 隐藏联系人姓名的TextView组件,因为对于通话记录文件夹本身不需要展示联系人姓名。 + mCallName.setVisibility(View.GONE); + // 显示提醒图标(这里的提醒图标可能代表通话记录相关的特定含义),并设置其可见状态为显示。 + mAlert.setVisibility(View.VISIBLE); + // 设置标题的文本样式为主要项目的文本外观样式(通过资源ID `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())); + // 设置提醒图标的资源为通话记录相关的图标(`R.drawable.call_record`),使其显示对应的图标样式。 + mAlert.setImageResource(R.drawable.call_record); + } else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) { + // 如果便签的父ID是通话记录文件夹的ID,意味着该便签属于通话记录文件夹下的具体便签,进行以下设置。 + mCallName.setVisibility(View.VISIBLE); + // 设置联系人姓名的TextView组件显示对应的联系人姓名,通过获取便签数据中的联系人姓名属性进行展示。 + mCallName.setText(data.getCallName()); + // 设置标题的文本样式为次要项目的文本外观样式(通过资源ID `R.style.TextAppearanceSecondaryItem`指定)。 + mTitle.setTextAppearance(context, R.style.TextAppearanceSecondaryItem); + // 设置标题的文本内容为格式化后的便签片段内容(通过`DataUtils`工具类的方法进行格式化处理),展示便签的主要摘要信息。 + mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); + // 如果便签有提醒设置,则显示提醒图标(这里是时钟图标代表提醒),并设置其可见状态为显示。 + if (data.hasAlert()) { + mAlert.setImageResource(R.drawable.clock); + mAlert.setVisibility(View.VISIBLE); + } else { + // 如果没有提醒设置,则隐藏提醒图标。 + mAlert.setVisibility(View.GONE); + } + } else { + // 如果便签不属于通话记录文件夹相关情况,进行以下通用的便签UI设置。 + mCallName.setVisibility(View.GONE); + 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())); + 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); + } + } + } + + // 设置时间的TextView组件显示的文本内容,通过`DateUtils`工具类的方法将便签的修改时间戳转换为相对时间的文本格式(如“刚刚”“10分钟前”等)展示给用户。 + mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); + + // 调用`setBackground`方法,根据便签的数据信息(如类型、状态等)设置列表项的背景样式,以区分不同情况的便签显示效果。 + setBackground(data); + } + + // 私有方法,根据便签的数据信息(主要是类型、是否单独、是否是第一个、最后一个等状态信息)来设置列表项的背景资源, + // 通过`NoteItemBgResources`工具类的相关方法获取对应的背景资源ID,并设置为当前列表项的背景。 + private void setBackground(NoteItemData data) { + int id = data.getBgColorId(); + if (data.getType() == Notes.TYPE_NOTE) { + // 如果是普通便签类型,根据便签的不同状态设置不同的背景资源。 + if (data.isSingle() || data.isOneFollowingFolder()) { + setBackgroundResource(NoteItemBgResources.getNoteBgSingleRes(id)); + } else if (data.isLast()) { + setBackgroundResource(NoteItemBgResources.getNoteBgLastRes(id)); + } else if (data.isFirst() || data.isMultiFollowingFolder()) { + setBackgroundResource(NoteItemBgResources.getNoteBgFirstRes(id)); + } else { + setBackgroundResource(NoteItemBgResources.getNoteBgNormalRes(id)); + } + } else { + // 如果是文件夹类型,则统一设置为文件夹对应的背景资源(通过`NoteItemBgResources`工具类的相关方法获取)。 + setBackgroundResource(NoteItemBgResources.getFolderBgRes()); + } + } + + // 用于获取当前列表项对应的便签数据对象,外部代码可以调用该方法获取便签的详细信息,方便进行其他相关的业务逻辑处理(比如点击列表项后根据便签数据进行相应操作等)。 + public NoteItemData getItemData() { + return mItemData; + } +} \ No newline at end of file