/* * 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; // 构造方法,接收上下文对象,初始化视图相关操作: // 1. 调用父类(LinearLayout)构造方法传入上下文。 // 2. 通过inflate加载指定布局文件(R.layout.note_item)到当前视图。 // 3. 利用findViewById找到布局内各子视图控件并赋值给对应成员变量,完成视图初始化。 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) { // 根据多选模式及笔记类型决定CheckBox的显示与勾选状态: if (choiceMode && data.getType() == Notes.TYPE_NOTE) { mCheckBox.setVisibility(View.VISIBLE); mCheckBox.setChecked(checked); } else { mCheckBox.setVisibility(View.GONE); } // 保存传入的笔记数据对象,供后续操作使用。 mItemData = data; // 依据笔记数据对象的不同情况设置各控件显示内容和可见性: if (data.getId() == Notes.ID_CALL_RECORD_FOLDER) { // 当前为通话记录文件夹时的设置: mCallName.setVisibility(View.GONE); mAlert.setVisibility(View.VISIBLE); 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.setImageResource(R.drawable.call_record); } else if (data.getParentId() == Notes.ID_CALL_RECORD_FOLDER) { // 当前为通话记录文件夹下笔记时的设置: mCallName.setVisibility(View.VISIBLE); mCallName.setText(data.getCallName()); mTitle.setTextAppearance(context, R.style.TextAppearanceSecondaryItem); mTitle.setText(DataUtils.getFormattedSnippet(data.getSnippet())); if (data.hasAlert()) { mAlert.setImageResource(R.drawable.clock); mAlert.setVisibility(View.VISIBLE); } else { mAlert.setVisibility(View.GONE); } } else { // 其他普通笔记或文件夹类型笔记时的通用设置: mCallName.setVisibility(View.GONE); mTitle.setTextAppearance(context, R.style.TextAppearancePrimaryItem); 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); } } } // 设置时间文本为相对时间格式字符串,展示笔记最后修改时间。 mTime.setText(DateUtils.getRelativeTimeSpanString(data.getModifiedDate())); // 根据笔记数据设置列表项背景样式,增强不同类型笔记的视觉区分度。 setBackground(data); } // 私有方法,依据笔记数据对象来设置当前列表项的背景资源样式,按照笔记类型及在列表中的位置等属性选用合适背景资源: 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 { // 非普通笔记(如文件夹)统一设置对应的文件夹背景资源。 setBackgroundResource(NoteItemBgResources.getFolderBgRes()); } } // 对外提供获取当前列表项对应的笔记数据对象的方法,方便外部代码获取笔记详细信息用于其他逻辑处理或数据传递。 public NoteItemData getItemData() { return mItemData; } }