diff --git a/src/src/net/micode/notes/ui/AlarmAlertActivity.java b/src/src/net/micode/notes/ui/AlarmAlertActivity.java index 85723be..775d3c9 100644 --- a/src/src/net/micode/notes/ui/AlarmAlertActivity.java +++ b/src/src/net/micode/notes/ui/AlarmAlertActivity.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +//刘小娣注释 package net.micode.notes.ui; - + import android.app.Activity; import android.app.AlertDialog; import android.content.Context; @@ -32,68 +32,91 @@ import android.os.PowerManager; import android.provider.Settings; import android.view.Window; import android.view.WindowManager; - + import net.micode.notes.R; import net.micode.notes.data.Notes; import net.micode.notes.tool.DataUtils; - + import java.io.IOException; - - + public class AlarmAlertActivity extends Activity implements OnClickListener, OnDismissListener { - private long mNoteId; - private String mSnippet; + private long mNoteId; //文本在数据库存储中的ID号 + private String mSnippet; //闹钟提示时出现的文本片段 private static final int SNIPPET_PREW_MAX_LEN = 60; MediaPlayer mPlayer; - + @Override - protected void onCreate(Bundle savedInstanceState) { + protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + //Bundle类型的数据与Map类型的数据相似,都是以key-value的形式存储数据的 + //onsaveInstanceState方法是用来保存Activity的状态的 + //能从onCreate的参数savedInsanceState中获得状态数据 requestWindowFeature(Window.FEATURE_NO_TITLE); - + //界面显示——无标题 + final Window win = getWindow(); win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); - + if (!isScreenOn()) { win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON + //保持窗体点亮 | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + //将窗体点亮 | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON + //允许窗体点亮时锁屏 | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR); - } - + }//在手机锁屏后如果到了闹钟提示时间,点亮屏幕 + Intent intent = getIntent(); - + try { mNoteId = Long.valueOf(intent.getData().getPathSegments().get(1)); mSnippet = DataUtils.getSnippetById(this.getContentResolver(), mNoteId); + //根据ID从数据库中获取标签的内容; + //getContentResolver()是实现数据共享,实例存储。 mSnippet = mSnippet.length() > SNIPPET_PREW_MAX_LEN ? mSnippet.substring(0, SNIPPET_PREW_MAX_LEN) + getResources().getString(R.string.notelist_string_info) : mSnippet; + //判断标签片段是否达到符合长度 } catch (IllegalArgumentException e) { e.printStackTrace(); return; } - + /* + try + { + // 代码区 + } + catch(Exception e) + { + // 异常处理 + } + 代码区如果有错误,就会返回所写异常的处理。*/ mPlayer = new MediaPlayer(); if (DataUtils.visibleInNoteDatabase(getContentResolver(), mNoteId, Notes.TYPE_NOTE)) { showActionDialog(); + //弹出对话框 playAlarmSound(); + //闹钟提示音激发 } else { finish(); + //完成闹钟动作 } } - + private boolean isScreenOn() { + //判断屏幕是否锁屏,调用系统函数判断,最后返回值是布尔类型 PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); return pm.isScreenOn(); } - + private void playAlarmSound() { + //闹钟提示音激发 Uri url = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_ALARM); - + //调用系统的铃声管理URI,得到闹钟提示音 int silentModeStreams = Settings.System.getInt(getContentResolver(), Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0); - + if ((silentModeStreams & (1 << AudioManager.STREAM_ALARM)) != 0) { mPlayer.setAudioStreamType(silentModeStreams); } else { @@ -101,12 +124,19 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD } try { mPlayer.setDataSource(this, url); + //方法:setDataSource(Context context, Uri uri) + //解释:无返回值,设置多媒体数据来源【根据 Uri】 mPlayer.prepare(); + //准备同步 mPlayer.setLooping(true); + //设置是否循环播放 mPlayer.start(); + //开始播放 } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); + //e.printStackTrace()函数功能是抛出异常, 还将显示出更深的调用信息 + //System.out.println(e),这个方法打印出异常,并且输出在哪里出现的异常 } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -118,41 +148,61 @@ public class AlarmAlertActivity extends Activity implements OnClickListener, OnD e.printStackTrace(); } } - + private void showActionDialog() { AlertDialog.Builder dialog = new AlertDialog.Builder(this); + //AlertDialog的构造方法全部是Protected的 + //所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 + //要创建一个AlertDialog,就要用到AlertDialog.Builder中的create()方法 + //如这里的dialog就是新建了一个AlertDialog dialog.setTitle(R.string.app_name); + //为对话框设置标题 dialog.setMessage(mSnippet); + //为对话框设置内容 dialog.setPositiveButton(R.string.notealert_ok, this); + //给对话框添加"Yes"按钮 if (isScreenOn()) { dialog.setNegativeButton(R.string.notealert_enter, this); - } + }//对话框添加"No"按钮 dialog.show().setOnDismissListener(this); } - + public void onClick(DialogInterface dialog, int which) { switch (which) { + //用which来选择click后下一步的操作 case DialogInterface.BUTTON_NEGATIVE: + //这是取消操作 Intent intent = new Intent(this, NoteEditActivity.class); + //实现两个类间的数据传输 intent.setAction(Intent.ACTION_VIEW); + //设置动作属性 intent.putExtra(Intent.EXTRA_UID, mNoteId); + //实现key-value对 + //EXTRA_UID为key;mNoteId为键 startActivity(intent); + //开始动作 break; default: + //这是确定操作 break; } } - + public void onDismiss(DialogInterface dialog) { + //忽略 stopAlarmSound(); + //停止闹钟声音 finish(); + //完成该动作 } - + private void stopAlarmSound() { if (mPlayer != null) { mPlayer.stop(); + //停止播放 mPlayer.release(); + //释放MediaPlayer对象 mPlayer = null; } } -} +} \ No newline at end of file diff --git a/src/src/net/micode/notes/ui/AlarmInitReceiver.java b/src/src/net/micode/notes/ui/AlarmInitReceiver.java index f221202..7a4c1ba 100644 --- a/src/src/net/micode/notes/ui/AlarmInitReceiver.java +++ b/src/src/net/micode/notes/ui/AlarmInitReceiver.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +//刘小娣注释 package net.micode.notes.ui; - + import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; @@ -23,43 +23,64 @@ import android.content.ContentUris; import android.content.Context; import android.content.Intent; import android.database.Cursor; - + import net.micode.notes.data.Notes; import net.micode.notes.data.Notes.NoteColumns; - - + + public class AlarmInitReceiver extends BroadcastReceiver { - + private static final String [] PROJECTION = new String [] { NoteColumns.ID, NoteColumns.ALERTED_DATE }; - + //对数据库的操作,调用标签ID和闹钟时间 private static final int COLUMN_ID = 0; private static final int COLUMN_ALERTED_DATE = 1; - + @Override public void onReceive(Context context, Intent intent) { long currentDate = System.currentTimeMillis(); + //System.currentTimeMillis()产生一个当前的毫秒 + //这个毫秒其实就是自1970年1月1日0时起的毫秒数 Cursor c = context.getContentResolver().query(Notes.CONTENT_NOTE_URI, PROJECTION, NoteColumns.ALERTED_DATE + ">? AND " + NoteColumns.TYPE + "=" + Notes.TYPE_NOTE, new String[] { String.valueOf(currentDate) }, + //将long变量currentDate转化为字符串 null); - + //Cursor在这里的作用是通过查找数据库中的标签内容,找到和当前系统时间相等的标签 + if (c != null) { - if (c.moveToFirst()) { - do { - long alertDate = c.getLong(COLUMN_ALERTED_DATE); - Intent sender = new Intent(context, AlarmReceiver.class); - sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID))); - PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0); - AlarmManager alermManager = (AlarmManager) context - .getSystemService(Context.ALARM_SERVICE); - alermManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent); - } while (c.moveToNext()); - } - c.close(); - } + // 如果游标不为空 + if (c.moveToFirst()) { + // 移动到游标的第一行记录 + do { + // 获取提醒日期字段的值 + long alertDate = c.getLong(COLUMN_ALERTED_DATE); + + // 创建一个新的意图,指向AlarmReceiver类 + Intent sender = new Intent(context, AlarmReceiver.class); + // 将数据附加到意图的URI中,使用笔记的ID + sender.setData(ContentUris.withAppendedId(Notes.CONTENT_NOTE_URI, c.getLong(COLUMN_ID))); + + // 创建一个用于广播的PendingIntent + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, sender, 0); + + // 获取AlarmManager服务 + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + + // 设置定时触发,使用RTC_WAKEUP,触发时间为提醒日期 + alarmManager.set(AlarmManager.RTC_WAKEUP, alertDate, pendingIntent); + + } while (c.moveToNext()); // 移动到下一行记录,如果有的话 + } + + c.close(); // 关闭游标,释放资源 + } + + //然而通过网上查找资料发现,对于闹钟机制的启动,通常需要上面的几个步骤 + //如新建Intent、PendingIntent以及AlarmManager等 + //这里就是根据数据库里的闹钟时间创建一个闹钟机制 } -} +} \ No newline at end of file diff --git a/src/src/net/micode/notes/ui/AlarmReceiver.java b/src/src/net/micode/notes/ui/AlarmReceiver.java index 54e503b..9b224d6 100644 --- a/src/src/net/micode/notes/ui/AlarmReceiver.java +++ b/src/src/net/micode/notes/ui/AlarmReceiver.java @@ -13,18 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +//刘小娣注释 package net.micode.notes.ui; - + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; - + public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - intent.setClass(context, AlarmAlertActivity.class); + intent.setClass(context, AlarmAlertActivity.class); + //启动AlarmAlertActivity intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + //activity要存在于activity的栈中,而非activity的途径启动activity时必然不存在一个activity的栈 + //所以要新起一个栈装入启动的activity context.startActivity(intent); } } +//这是实现alarm这个功能最接近用户层的包,基于上面的两个包, +//作用还需要深究但是对于setClass和addFlags的 \ No newline at end of file diff --git a/src/src/net/micode/notes/ui/DateTimePicker.java b/src/src/net/micode/notes/ui/DateTimePicker.java index 496b0cd..925ee40 100644 --- a/src/src/net/micode/notes/ui/DateTimePicker.java +++ b/src/src/net/micode/notes/ui/DateTimePicker.java @@ -13,25 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +//刘小娣注释 package net.micode.notes.ui; - + import java.text.DateFormatSymbols; import java.util.Calendar; - + import net.micode.notes.R; - - + + import android.content.Context; import android.text.format.DateFormat; import android.view.View; import android.widget.FrameLayout; import android.widget.NumberPicker; - + public class DateTimePicker extends FrameLayout { - + //FrameLayout是布局模板之一 + //所有的子元素全部在屏幕的右上方 private static final boolean DEFAULT_ENABLE_STATE = true; - + private static final int HOURS_IN_HALF_DAY = 12; private static final int HOURS_IN_ALL_DAY = 24; private static final int DAYS_IN_ALL_WEEK = 7; @@ -45,25 +46,27 @@ public class DateTimePicker extends FrameLayout { private static final int MINUT_SPINNER_MAX_VAL = 59; private static final int AMPM_SPINNER_MIN_VAL = 0; private static final int AMPM_SPINNER_MAX_VAL = 1; - + //初始化控件 private final NumberPicker mDateSpinner; private final NumberPicker mHourSpinner; private final NumberPicker mMinuteSpinner; private final NumberPicker mAmPmSpinner; + //NumberPicker是数字选择器 + //这里定义的四个变量全部是在设置闹钟时需要选择的变量(如日期、时、分、上午或者下午) private Calendar mDate; - + //定义了Calendar类型的变量mDate,用于操作时间 private String[] mDateDisplayValues = new String[DAYS_IN_ALL_WEEK]; - + private boolean mIsAm; - + private boolean mIs24HourView; - + private boolean mIsEnabled = DEFAULT_ENABLE_STATE; - + private boolean mInitialising; - + private OnDateTimeChangedListener mOnDateTimeChangedListener; - + private NumberPicker.OnValueChangeListener mOnDateChangedListener = new NumberPicker.OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { @@ -71,41 +74,49 @@ public class DateTimePicker extends FrameLayout { updateDateControl(); onDateTimeChanged(); } - }; - + };//OnValueChangeListener,这是时间改变监听器,这里主要是对日期的监听 + //将现在日期的值传递给mDate;updateDateControl是同步操作 + private NumberPicker.OnValueChangeListener mOnHourChangedListener = new NumberPicker.OnValueChangeListener() { - @Override + //这里是对 小时(Hour) 的监听 + @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { boolean isDateChanged = false; Calendar cal = Calendar.getInstance(); + //声明一个Calendar的变量cal,便于后续的操作 if (!mIs24HourView) { if (!mIsAm && oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, 1); isDateChanged = true; + //这里是对于12小时制时,晚上11点和12点交替时对日期的更改 } else if (mIsAm && oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, -1); isDateChanged = true; - } + } + //这里是对于12小时制时,凌晨11点和12点交替时对日期的更改 if (oldVal == HOURS_IN_HALF_DAY - 1 && newVal == HOURS_IN_HALF_DAY || oldVal == HOURS_IN_HALF_DAY && newVal == HOURS_IN_HALF_DAY - 1) { mIsAm = !mIsAm; updateAmPmControl(); - } + }//这里是对于12小时制时,中午11点和12点交替时对AM和PM的更改 } else { if (oldVal == HOURS_IN_ALL_DAY - 1 && newVal == 0) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, 1); isDateChanged = true; + //这里是对于24小时制时,晚上11点和12点交替时对日期的更改 } else if (oldVal == 0 && newVal == HOURS_IN_ALL_DAY - 1) { cal.setTimeInMillis(mDate.getTimeInMillis()); cal.add(Calendar.DAY_OF_YEAR, -1); isDateChanged = true; } - } + } //这里是对于12小时制时,凌晨11点和12点交替时对日期的更改 int newHour = mHourSpinner.getValue() % HOURS_IN_HALF_DAY + (mIsAm ? 0 : HOURS_IN_HALF_DAY); + //通过数字选择器对newHour的赋值 mDate.set(Calendar.HOUR_OF_DAY, newHour); + //通过set函数将新的Hour值传给mDate onDateTimeChanged(); if (isDateChanged) { setCurrentYear(cal.get(Calendar.YEAR)); @@ -114,124 +125,172 @@ public class DateTimePicker extends FrameLayout { } } }; - + private NumberPicker.OnValueChangeListener mOnMinuteChangedListener = new NumberPicker.OnValueChangeListener() { @Override + //这里是对 分钟(Minute)改变的监听 public void onValueChange(NumberPicker picker, int oldVal, int newVal) { int minValue = mMinuteSpinner.getMinValue(); int maxValue = mMinuteSpinner.getMaxValue(); int offset = 0; + //设置offset,作为小时改变的一个记录数据 if (oldVal == maxValue && newVal == minValue) { offset += 1; } else if (oldVal == minValue && newVal == maxValue) { offset -= 1; } + //如果原值为59,新值为0,则offset加1 + //如果原值为0,新值为59,则offset减1 if (offset != 0) { - mDate.add(Calendar.HOUR_OF_DAY, offset); - mHourSpinner.setValue(getCurrentHour()); - updateDateControl(); - int newHour = getCurrentHourOfDay(); - if (newHour >= HOURS_IN_HALF_DAY) { - mIsAm = false; - updateAmPmControl(); - } else { - mIsAm = true; - updateAmPmControl(); - } - } - mDate.set(Calendar.MINUTE, newVal); - onDateTimeChanged(); - } - }; - + // 如果时间偏移量不为零 + mDate.add(Calendar.HOUR_OF_DAY, offset); + // 将日期增加指定的小时数 + + mHourSpinner.setValue(getCurrentHour()); + // 设置小时的Spinner控件的值为当前小时 + updateDateControl(); + // 更新日期控件的显示 + + int newHour = getCurrentHourOfDay(); + // 获取当前小时数 + if (newHour >= HOURS_IN_HALF_DAY) { + // 如果新的小时数大于等于一天中的半天(12小时) + mIsAm = false; + // 设置为下午 + updateAmPmControl(); + // 更新上午/下午控件 + } else { + // 如果新的小时数小于一天中的半天(12小时) + mIsAm = true; + // 设置为上午 + updateAmPmControl(); + // 更新上午/下午控件 + } + } + + mDate.set(Calendar.MINUTE, newVal); +// 设置日期的分钟字段为新值 + onDateTimeChanged(); +// 调用日期时间变更的回调方法 + }; + + private NumberPicker.OnValueChangeListener mOnAmPmChangedListener = new NumberPicker.OnValueChangeListener() { + // 对AM和PM的数值变化进行监听 + @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { + // 当数值变化时触发 mIsAm = !mIsAm; + // 切换上午/下午标识 + if (mIsAm) { + // 如果是上午 mDate.add(Calendar.HOUR_OF_DAY, -HOURS_IN_HALF_DAY); + // 将时间减去半天(12小时) } else { + // 如果是下午 mDate.add(Calendar.HOUR_OF_DAY, HOURS_IN_HALF_DAY); + // 将时间增加半天(12小时) } updateAmPmControl(); + // 更新上午/下午控件的显示 onDateTimeChanged(); + // 调用日期时间变更的回调方法 } }; public interface OnDateTimeChangedListener { + // 定义日期时间变更监听接口 void onDateTimeChanged(DateTimePicker view, int year, int month, int dayOfMonth, int hourOfDay, int minute); + // 方法用于回调告知日期时间的变更 } + public DateTimePicker(Context context) { this(context, System.currentTimeMillis()); - } - + }//通过对数据库的访问,获取当前的系统时间 + public DateTimePicker(Context context, long date) { this(context, date, DateFormat.is24HourFormat(context)); - } - + }//上面函数的得到的是一个天文数字(1970至今的秒数),需要DateFormat将其变得有意义 + public DateTimePicker(Context context, long date, boolean is24HourView) { super(context); + //获取系统时间 mDate = Calendar.getInstance(); mInitialising = true; mIsAm = getCurrentHourOfDay() >= HOURS_IN_HALF_DAY; inflate(context, R.layout.datetime_picker, this); - + //如果当前Activity里用到别的layout,比如对话框layout + //还要设置这个layout上的其他组件的内容,就必须用inflate()方法先将对话框的layout找出来 + //然后再用findViewById()找到它上面的其它组件 + // 获取日期选择器并设置最小值和最大值 mDateSpinner = (NumberPicker) findViewById(R.id.date); - mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL); - mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL); - mDateSpinner.setOnValueChangedListener(mOnDateChangedListener); + mDateSpinner.setMinValue(DATE_SPINNER_MIN_VAL); // 设置最小值 + mDateSpinner.setMaxValue(DATE_SPINNER_MAX_VAL); // 设置最大值 + mDateSpinner.setOnValueChangedListener(mOnDateChangedListener); // 设置数值变化监听器 +// 获取小时选择器并设置数值变化监听器 mHourSpinner = (NumberPicker) findViewById(R.id.hour); - mHourSpinner.setOnValueChangedListener(mOnHourChangedListener); - mMinuteSpinner = (NumberPicker) findViewById(R.id.minute); - mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL); - mMinuteSpinner.setMaxValue(MINUT_SPINNER_MAX_VAL); - mMinuteSpinner.setOnLongPressUpdateInterval(100); - mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener); + mHourSpinner.setOnValueChangedListener(mOnHourChangedListener); // 设置数值变化监听器 + +// 获取分钟选择器并设置最小值、最大值、长按更新间隔以及数值变化监听器 + mMinuteSpinner = (NumberPicker) findViewById(R.id.minute); + mMinuteSpinner.setMinValue(MINUT_SPINNER_MIN_VAL); // 设置最小值 + mMinuteSpinner.setMaxValue(MINUT_SPINNER_MAX_VAL); // 设置最大值 + mMinuteSpinner.setOnLongPressUpdateInterval(100); // 设置长按更新间隔 + mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener); // 设置数值变化监听器 +// 获取上午/下午选择器并设置最小值、最大值、显示值以及数值变化监听器 String[] stringsForAmPm = new DateFormatSymbols().getAmPmStrings(); mAmPmSpinner = (NumberPicker) findViewById(R.id.amPm); - mAmPmSpinner.setMinValue(AMPM_SPINNER_MIN_VAL); - mAmPmSpinner.setMaxValue(AMPM_SPINNER_MAX_VAL); - mAmPmSpinner.setDisplayedValues(stringsForAmPm); - mAmPmSpinner.setOnValueChangedListener(mOnAmPmChangedListener); + mAmPmSpinner.setMinValue(AMPM_SPINNER_MIN_VAL); // 设置最小值 + mAmPmSpinner.setMaxValue(AMPM_SPINNER_MAX_VAL); // 设置最大值 + mAmPmSpinner.setDisplayedValues(stringsForAmPm); // 设置显示值 + mAmPmSpinner.setOnValueChangedListener(mOnAmPmChangedListener); // 设置数值变化监听器 - // update controls to initial state - updateDateControl(); - updateHourControl(); - updateAmPmControl(); +// 更新控件至初始状态 + updateDateControl(); // 更新日期控件 + updateHourControl(); // 更新小时控件 + updateAmPmControl(); // 更新上午/下午控件 - set24HourView(is24HourView); + set24HourView(is24HourView); // 设置为24小时制或12小时制 - // set to current time - setCurrentDate(date); +// 设置为当前时间 + setCurrentDate(date); // 设置为指定日期时间 - setEnabled(isEnabled()); + setEnabled(isEnabled()); // 设置是否可用 - // set the content descriptions - mInitialising = false; - } +// 设置内容描述 + mInitialising = false; // 初始化标志位设为false + } + @Override public void setEnabled(boolean enabled) { - if (mIsEnabled == enabled) { + if (mIsEnabled == enabled) { // 如果当前状态已经是要设置的状态,无需改变 return; } - super.setEnabled(enabled); - mDateSpinner.setEnabled(enabled); - mMinuteSpinner.setEnabled(enabled); - mHourSpinner.setEnabled(enabled); - mAmPmSpinner.setEnabled(enabled); - mIsEnabled = enabled; + super.setEnabled(enabled); // 调用父类方法设置整体是否可用 + + mDateSpinner.setEnabled(enabled); // 设置日期选择器是否可用 + mMinuteSpinner.setEnabled(enabled); // 设置分钟选择器是否可用 + mHourSpinner.setEnabled(enabled); // 设置小时选择器是否可用 + mAmPmSpinner.setEnabled(enabled); // 设置上午/下午选择器是否可用 + + mIsEnabled = enabled; // 更新当前状态为设置的状态 } + //存在疑问!!!!!!!!!!!!!setEnabled的作用 + //下面的代码通过原程序的注释已经比较清晰,另外可以通过函数名来判断 + //下面的各函数主要是对上面代码引用到的各函数功能的实现 @Override public boolean isEnabled() { return mIsEnabled; } - + /** * Get the current date in millis * @@ -239,20 +298,32 @@ public class DateTimePicker extends FrameLayout { */ public long getCurrentDateInTimeMillis() { return mDate.getTimeInMillis(); - } - + }//实现函数——得到当前的秒数 + /** * Set the current date * * @param date The current date in millis */ - public void setCurrentDate(long date) { - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(date); - setCurrentDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), - cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE)); - } + public void setCurrentDate(int year, int month, + int dayOfMonth, int hourOfDay, int minute) { + // 设置当前日期和时间的年份 + setCurrentYear(year); + + // 设置当前日期和时间的月份 + setCurrentMonth(month); + // 设置当前日期和时间的日 + setCurrentDay(dayOfMonth); + + // 设置当前日期和时间的小时 + setCurrentHour(hourOfDay); + + // 设置当前日期和时间的分钟 + setCurrentMinute(minute); + } +//实现函数功能——设置当前的时间,参数是date + /** * Set the current date * @@ -269,31 +340,40 @@ public class DateTimePicker extends FrameLayout { setCurrentDay(dayOfMonth); setCurrentHour(hourOfDay); setCurrentMinute(minute); - } - + }//实现函数功能——设置当前的时间,参数是各详细的变量 + /** * Get current year * * @return The current year */ + //下面是得到year、month、day等值 public int getCurrentYear() { return mDate.get(Calendar.YEAR); } - + /** * Set current year * * @param year The current year */ public void setCurrentYear(int year) { + // 如果不是初始化过程,并且传入的年份与当前年份相同,则直接返回,不进行更新 if (!mInitialising && year == getCurrentYear()) { return; } + + // 设置日期对象的年份为传入的年份 mDate.set(Calendar.YEAR, year); + + // 更新日期控件,确保界面显示正确的年份 updateDateControl(); + + // 调用日期时间变化的回调方法,通知相关监听器日期时间已发生改变 onDateTimeChanged(); } + /** * Get current month in the year * @@ -302,58 +382,76 @@ public class DateTimePicker extends FrameLayout { public int getCurrentMonth() { return mDate.get(Calendar.MONTH); } - + /** * Set current month in the year * * @param month The month in the year */ public void setCurrentMonth(int month) { - if (!mInitialising && month == getCurrentMonth()) { + // 如果不是初始化过程,并且传入的月份与当前月份相同,则直接返回,不进行更新 + if (!mInitialising && month == getCurrentMonth()) { return; } + + // 设置日期对象的月份为传入的月份 mDate.set(Calendar.MONTH, month); + + // 更新日期控件,确保界面显示正确的月份 updateDateControl(); + + // 调用日期时间变化的回调方法,通知相关监听器日期时间已发生改变 onDateTimeChanged(); } - /** - * Get current day of the month - * - * @return The day of the month - */ +/** + * 获取当前月份的日期 + * + * @return 月份中的某一天 + */ public int getCurrentDay() { return mDate.get(Calendar.DAY_OF_MONTH); } - /** - * Set current day of the month - * - * @param dayOfMonth The day of the month - */ +/** + * 设置当前月份的日期 + * + * @param dayOfMonth 月份中的某一天 + */ public void setCurrentDay(int dayOfMonth) { - if (!mInitialising && dayOfMonth == getCurrentDay()) { + // 如果不是初始化过程,并且传入的日期与当前日期相同,则直接返回,不进行更新 + if (!mInitialising && dayOfMonth == getCurrentDay()) { return; } + + // 设置日期对象的日期为传入的日期 mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); + + // 更新日期控件,确保界面显示正确的日期 updateDateControl(); + + // 调用日期时间变化的回调方法,通知相关监听器日期时间已发生改变 onDateTimeChanged(); } - /** - * Get current hour in 24 hour mode, in the range (0~23) - * @return The current hour in 24 hour mode - */ +/** + * 获取当前的24小时制小时数,范围为(0~23) + * @return 当前的24小时制小时数 + */ public int getCurrentHourOfDay() { return mDate.get(Calendar.HOUR_OF_DAY); } +/** + * 获取当前小时数,根据是否为24小时制进行调整 + * @return 当前小时数 + */ private int getCurrentHour() { if (mIs24HourView){ return getCurrentHourOfDay(); } else { int hour = getCurrentHourOfDay(); - if (hour > HOURS_IN_HALF_DAY) { + if (hour > HOURS_IN_HALF_DAY) { return hour - HOURS_IN_HALF_DAY; } else { return hour == 0 ? HOURS_IN_HALF_DAY : hour; @@ -361,20 +459,27 @@ public class DateTimePicker extends FrameLayout { } } +//以上是对给定代码的中文注释,每个方法的作用和逻辑都有了解释,有助于理解代码的功能。 + /** * Set current hour in 24 hour mode, in the range (0~23) * * @param hourOfDay */ public void setCurrentHour(int hourOfDay) { - if (!mInitialising && hourOfDay == getCurrentHourOfDay()) { + // 如果不是初始化过程,并且传入的小时与当前小时相同,则直接返回,不进行更新 + if (!mInitialising && hourOfDay == getCurrentHourOfDay()) { return; } + + // 设置日期对象的小时为传入的小时 mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); + + // 如果不是24小时制,则根据小时设置上午/下午标志位 if (!mIs24HourView) { - if (hourOfDay >= HOURS_IN_HALF_DAY) { + if (hourOfDay >= HOURS_IN_HALF_DAY) { mIsAm = false; - if (hourOfDay > HOURS_IN_HALF_DAY) { + if (hourOfDay > HOURS_IN_HALF_DAY) { hourOfDay -= HOURS_IN_HALF_DAY; } } else { @@ -383,103 +488,134 @@ public class DateTimePicker extends FrameLayout { hourOfDay = HOURS_IN_HALF_DAY; } } + // 更新上午/下午控件的显示 updateAmPmControl(); } + + // 设置小时控件的值为传入的小时 mHourSpinner.setValue(hourOfDay); + + // 调用日期时间变化的回调方法,通知相关监听器日期时间已发生改变 onDateTimeChanged(); } - /** - * Get currentMinute - * - * @return The Current Minute - */ +/** + * 获取当前的分钟数 + * + * @return 当前分钟数 + */ public int getCurrentMinute() { return mDate.get(Calendar.MINUTE); } - /** - * Set current minute - */ +/** + * 设置当前的分钟数 + */ public void setCurrentMinute(int minute) { - if (!mInitialising && minute == getCurrentMinute()) { + // 如果不是初始化过程,并且传入的分钟与当前分钟相同,则直接返回,不进行更新 + if (!mInitialising && minute == getCurrentMinute()) { return; } + + // 设置日期对象的分钟为传入的分钟 mMinuteSpinner.setValue(minute); mDate.set(Calendar.MINUTE, minute); + + // 调用日期时间变化的回调方法,通知相关监听器日期时间已发生改变 onDateTimeChanged(); } - /** - * @return true if this is in 24 hour view else false. - */ +/** + * 判断是否为24小时制 + * + * @return 如果为24小时制返回true,否则返回false + */ public boolean is24HourView () { return mIs24HourView; } - /** - * Set whether in 24 hour or AM/PM mode. - * - * @param is24HourView True for 24 hour mode. False for AM/PM mode. - */ +/** + * 设置时间显示为24小时制或AM/PM模式 + * + * @param is24HourView True表示为24小时制,False表示为AM/PM模式 + */ public void set24HourView(boolean is24HourView) { + // 如果当前模式与要设置的模式相同,则直接返回,不进行更新 if (mIs24HourView == is24HourView) { return; } + + // 更新模式为传入的模式 mIs24HourView = is24HourView; + + // 根据模式设置上午/下午控件的可见性 mAmPmSpinner.setVisibility(is24HourView ? View.GONE : View.VISIBLE); + + // 获取当前小时数 int hour = getCurrentHourOfDay(); + + // 更新小时控件的显示 updateHourControl(); + + // 设置当前小时数,以触发小时控件的值改变事件 setCurrentHour(hour); + + // 更新上午/下午控件的显示 updateAmPmControl(); } + + // 更新日期控件 private void updateDateControl() { - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(mDate.getTimeInMillis()); - cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1); - mDateSpinner.setDisplayedValues(null); - for (int i = 0; i < DAYS_IN_ALL_WEEK; ++i) { - cal.add(Calendar.DAY_OF_YEAR, 1); - mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal); + Calendar cal = Calendar.getInstance(); // 创建一个 Calendar 对象 + cal.setTimeInMillis(mDate.getTimeInMillis()); // 用给定的时间设置 Calendar 对象 + cal.add(Calendar.DAY_OF_YEAR, -DAYS_IN_ALL_WEEK / 2 - 1); // 减去一周的一半和一天的时间 + + mDateSpinner.setDisplayedValues(null); // 清除日期 Spinner 的显示值 + for (int i = 0; i < DAYS_IN_ALL_WEEK; ++i) { // 循环一周的每一天 + cal.add(Calendar.DAY_OF_YEAR, 1); // 增加一天 + mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal); // 格式化日期并保存在数组中 } - mDateSpinner.setDisplayedValues(mDateDisplayValues); - mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); - mDateSpinner.invalidate(); - } + mDateSpinner.setDisplayedValues(mDateDisplayValues); // 设置日期 Spinner 的显示值 + mDateSpinner.setValue(DAYS_IN_ALL_WEEK / 2); // 设置 Spinner 的初始值为一周的中间位置 + mDateSpinner.invalidate(); // 刷新 Spinner + }// 对于星期几的算法 + +// 更新上午/下午控件 private void updateAmPmControl() { - if (mIs24HourView) { - mAmPmSpinner.setVisibility(View.GONE); + if (mIs24HourView) { // 如果是24小时制 + mAmPmSpinner.setVisibility(View.GONE); // 隐藏上午/下午 Spinner } else { - int index = mIsAm ? Calendar.AM : Calendar.PM; - mAmPmSpinner.setValue(index); - mAmPmSpinner.setVisibility(View.VISIBLE); - } + int index = mIsAm ? Calendar.AM : Calendar.PM; // 根据mIsAm确定上午/下午的索引 + mAmPmSpinner.setValue(index); // 设置上午/下午 Spinner 的值为索引所对应的值 + mAmPmSpinner.setVisibility(View.VISIBLE); // 显示上午/下午 Spinner + }// 对于上下午操作的算法 } +// 更新小时控件 private void updateHourControl() { - if (mIs24HourView) { - mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); - mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW); + if (mIs24HourView) { // 如果是24小时制 + mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_24_HOUR_VIEW); // 设置小时 Spinner 的最小值 + mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_24_HOUR_VIEW); // 设置小时 Spinner 的最大值 } else { - mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); - mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); - } + mHourSpinner.setMinValue(HOUR_SPINNER_MIN_VAL_12_HOUR_VIEW); // 设置小时 Spinner 的最小值(12小时制) + mHourSpinner.setMaxValue(HOUR_SPINNER_MAX_VAL_12_HOUR_VIEW); // 设置小时 Spinner 的最大值(12小时制) + }// 对于小时的算法 } - /** - * Set the callback that indicates the 'Set' button has been pressed. - * @param callback the callback, if null will do nothing - */ +/** + * 设置当点击“设置”按钮时的回调函数 + * @param callback 回调函数,如果为null将不执行任何操作 + */ public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback) { - mOnDateTimeChangedListener = callback; + mOnDateTimeChangedListener = callback; // 设置时间变化的监听器 } private void onDateTimeChanged() { if (mOnDateTimeChangedListener != null) { + // 如果监听器不为空,调用监听器的回调函数,传递当前年份、月份、日期、小时和分钟 mOnDateTimeChangedListener.onDateTimeChanged(this, getCurrentYear(), getCurrentMonth(), getCurrentDay(), getCurrentHourOfDay(), getCurrentMinute()); } } -} diff --git a/src/src/net/micode/notes/ui/DateTimePickerDialog.java b/src/src/net/micode/notes/ui/DateTimePickerDialog.java index 2c47ba4..6c59e00 100644 --- a/src/src/net/micode/notes/ui/DateTimePickerDialog.java +++ b/src/src/net/micode/notes/ui/DateTimePickerDialog.java @@ -13,78 +13,114 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - +//刘小娣注释 package net.micode.notes.ui; - + import java.util.Calendar; - + import net.micode.notes.R; import net.micode.notes.ui.DateTimePicker; import net.micode.notes.ui.DateTimePicker.OnDateTimeChangedListener; - + import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.text.format.DateFormat; import android.text.format.DateUtils; - + public class DateTimePickerDialog extends AlertDialog implements OnClickListener { - + private Calendar mDate = Calendar.getInstance(); + //创建一个Calendar类型的变量 mDate,方便时间的操作 private boolean mIs24HourView; private OnDateTimeSetListener mOnDateTimeSetListener; + //声明一个时间日期滚动选择控件 mOnDateTimeSetListener private DateTimePicker mDateTimePicker; - + //DateTimePicker控件,控件一般用于让用户可以从日期列表中选择单个值。 + //运行时,单击控件边上的下拉箭头,会显示为两个部分:一个下拉列表,一个用于选择日期的 + public interface OnDateTimeSetListener { void OnDateTimeSet(AlertDialog dialog, long date); } - + public DateTimePickerDialog(Context context, long date) { + //对该界面对话框的实例化 super(context); + //对数据库的操作 mDateTimePicker = new DateTimePicker(context); setView(mDateTimePicker); - mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() { - public void onDateTimeChanged(DateTimePicker view, int year, int month, - int dayOfMonth, int hourOfDay, int minute) { - mDate.set(Calendar.YEAR, year); - mDate.set(Calendar.MONTH, month); - mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); - mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); - mDate.set(Calendar.MINUTE, minute); + //添加一个子视图 + 下面是给上述代码逐行添加中文注释的版本: +// 设置日期时间选择器的日期时间变更监听器 + mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener() { + // 当日期时间变更时调用的方法 + public void onDateTimeChanged(DateTimePicker view, int year, int month, + int dayOfMonth, int hourOfDay, int minute) { + // 设置 Calendar 对象的年份 + mDate.set(Calendar.YEAR, year); + // 设置 Calendar 对象的月份(注意:月份从 0 开始,因此需要减去 1) + mDate.set(Calendar.MONTH, month); + // 设置 Calendar 对象的日 + mDate.set(Calendar.DAY_OF_MONTH, dayOfMonth); + // 设置 Calendar 对象的小时 + mDate.set(Calendar.HOUR_OF_DAY, hourOfDay); + // 设置 Calendar 对象的分钟 + mDate.set(Calendar.MINUTE, minute); + } + }); + +//这段代码是一个 Android 应用中使用的日期时间选择器的监听器设置。在监听器的onDateTimeChanged方法中,通过传递进来的参数,设置了一个 Calendar 对象的各个字段,以便后续使用。希望这样的注释对你理解代码有所帮助。 + //将视图中的各选项设置为系统当前时间 updateTitle(mDate.getTimeInMillis()); } }); mDate.setTimeInMillis(date); + //得到系统时间 mDate.set(Calendar.SECOND, 0); + //将秒数设置为0 mDateTimePicker.setCurrentDate(mDate.getTimeInMillis()); setButton(context.getString(R.string.datetime_dialog_ok), this); setButton2(context.getString(R.string.datetime_dialog_cancel), (OnClickListener)null); + //设置按钮 set24HourView(DateFormat.is24HourFormat(this.getContext())); + //时间标准化打印 updateTitle(mDate.getTimeInMillis()); } - + public void set24HourView(boolean is24HourView) { mIs24HourView = is24HourView; } - + public void setOnDateTimeSetListener(OnDateTimeSetListener callBack) { mOnDateTimeSetListener = callBack; - } - + }//将时间日期滚动选择控件实例化 + + // 更新标题的方法,接收一个代表日期时间的长整型参数 private void updateTitle(long date) { + // 定义标志,指定要显示的日期和时间的格式 int flag = - DateUtils.FORMAT_SHOW_YEAR | - DateUtils.FORMAT_SHOW_DATE | - DateUtils.FORMAT_SHOW_TIME; + DateUtils.FORMAT_SHOW_YEAR | // 显示年份 + DateUtils.FORMAT_SHOW_DATE | // 显示日期 + DateUtils.FORMAT_SHOW_TIME; // 显示时间 + + // 根据 24 小时制的设置,添加相应的标志 flag |= mIs24HourView ? DateUtils.FORMAT_24HOUR : DateUtils.FORMAT_24HOUR; + + // 使用 DateUtils 类的 formatDateTime 方法,将长整型的日期时间格式化为字符串,并设置标题 setTitle(DateUtils.formatDateTime(this.getContext(), date, flag)); } - +//android开发中常见日期管理工具类(API)——DateUtils:按照上下午显示时间 + + // 当对话框按钮被点击时触发的方法,接收两个参数:DialogInterface 和 int public void onClick(DialogInterface arg0, int arg1) { + // 检查是否设置了日期时间监听器 if (mOnDateTimeSetListener != null) { + // 调用监听器的 OnDateTimeSet 方法,传递当前对象和日期时间的毫秒表示 mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis()); } } - +//第一个参数arg0是接收到点击事件的对话框 + //第二个参数arg1是该对话框上的按钮 + } \ No newline at end of file diff --git a/src/src/net/micode/notes/ui/DropdownMenu.java b/src/src/net/micode/notes/ui/DropdownMenu.java index 613dc74..97e8c34 100644 --- a/src/src/net/micode/notes/ui/DropdownMenu.java +++ b/src/src/net/micode/notes/ui/DropdownMenu.java @@ -1,3 +1,4 @@ +//于亚榕注释 /* * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) * @@ -28,16 +29,22 @@ import android.widget.PopupMenu.OnMenuItemClickListener; import net.micode.notes.R; public class DropdownMenu { + //显示按钮 private Button mButton; + //显示一个弹出菜单 private PopupMenu mPopupMenu; + //声明一个下拉菜单 private Menu mMenu; public DropdownMenu(Context context, Button button, int menuId) { mButton = button; mButton.setBackgroundResource(R.drawable.dropdown_icon); + //设置这个view的背景 mPopupMenu = new PopupMenu(context, mButton); mMenu = mPopupMenu.getMenu(); mPopupMenu.getMenuInflater().inflate(menuId, mMenu); + //MenuInflater是用来实例化Menu目录下的Menu布局文件 + //根据ID来确认menu的内容选项 mButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { mPopupMenu.show(); @@ -48,14 +55,14 @@ public class DropdownMenu { public void setOnDropdownMenuItemClickListener(OnMenuItemClickListener listener) { if (mPopupMenu != null) { mPopupMenu.setOnMenuItemClickListener(listener); - } + }//设置菜单的监听 } public MenuItem findItem(int id) { return mMenu.findItem(id); - } + }//对于菜单选项的初始化,根据索引搜索菜单需要的选项 public void setTitle(CharSequence title) { mButton.setText(title); - } + }//布局文件,设置标题 } diff --git a/src/src/net/micode/notes/ui/FoldersListAdapter.java b/src/src/net/micode/notes/ui/FoldersListAdapter.java index 96b77da..8a811da 100644 --- a/src/src/net/micode/notes/ui/FoldersListAdapter.java +++ b/src/src/net/micode/notes/ui/FoldersListAdapter.java @@ -1,3 +1,4 @@ +//于亚榕注释 /* * Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net) * @@ -30,10 +31,14 @@ import net.micode.notes.data.Notes.NoteColumns; public class FoldersListAdapter extends CursorAdapter { + //CursorAdapter是Cursor和ListView的接口 + //FoldersListAdapter继承了CursorAdapter的类 + //主要作用是便签数据库和用户的交互 + //这里就是用folder(文件夹)的形式展现给用户 public static final String [] PROJECTION = { NoteColumns.ID, NoteColumns.SNIPPET - }; + };//调用数据库中便签的ID和片段 public static final int ID_COLUMN = 0; public static final int NAME_COLUMN = 1; @@ -41,34 +46,37 @@ public class FoldersListAdapter extends CursorAdapter { public FoldersListAdapter(Context context, Cursor c) { super(context, c); // TODO Auto-generated constructor stub - } + }//数据库操作 @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { - return new FolderListItem(context); - } + //ViewGroup是容器 + return new FolderListItem(context); + }//创建一个文件夹,对于各文件夹中子标签的初始化 @Override - public void bindView(View view, Context context, Cursor cursor) { - if (view instanceof FolderListItem) { - String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context - .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); - ((FolderListItem) view).bind(folderName); + public void bindView(View view, Context context, Cursor cursor) {//view表示要绑定数据的视图,context表示上下文对象,cursor表示数据源中的游标对象 + if (view instanceof FolderListItem) {//判断该视图是否是文件夹列表项的视图 + String folderName = (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context//通过游标对象cursor获取相应列的数据 + .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN);//获取上级文件夹的名称字符串 + ((FolderListItem) view).bind(folderName);//将获取到的文件夹名称通过调用((FolderListItem) view).bind(folderName)方法绑定到FolderListItem视图上 } - } + }//将各个布局文件绑定起来 - public String getFolderName(Context context, int position) { - Cursor cursor = (Cursor) getItem(position); + public String getFolderName(Context context, int position) {//context表示上下文对象,position表示列表中的位置 + Cursor cursor = (Cursor) getItem(position);//获取在指定位置上的数据项,这里将其强制转换为Cursor对象,并赋值给cursor变量 return (cursor.getLong(ID_COLUMN) == Notes.ID_ROOT_FOLDER) ? context .getString(R.string.menu_move_parent_folder) : cursor.getString(NAME_COLUMN); - } + }//根据数据库中标签的ID得到标签的各项内容 private class FolderListItem extends LinearLayout { private TextView mName; public FolderListItem(Context context) { super(context); + //操作数据库 inflate(context, R.layout.folder_list_item, this); + //根据布局文件的名字等信息将其找出来 mName = (TextView) findViewById(R.id.tv_folder_name); } @@ -77,4 +85,4 @@ public class FoldersListAdapter extends CursorAdapter { } } -} +} \ No newline at end of file