先下载代码,解压。
http://androidappdocs.appspot.com/resources/tutorials/notepad/codelab/NotepadCodeLab.zip
File > New > Android Project
选择 Create project from existing source
点击Browse 找到Notepadv1
选择sdk版本。
打开可以看到src下有一个NotesDbAdapter。这个类是操作SQLite数据库的封装类。
打开res\layout\notepad_list.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</LinearLayout>
添加代码。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ListView android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView android:id="@android:id/empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/no_notes"/>
</LinearLayout>
ID list 和 empty 是由Android平台提供,所以前面要加命名空间android
当ListAdapter 不能为ListView提供数据的时候。Empty为自动被使用。当然我们可以用setEmptyView(View)把ListView设置为空。
(ListAdapter是ListView和数据的桥梁,通常来自光标)
打开 res/layout
/notes_row.xml
每个记事本的标题文本。
<?xml version="1.0" encoding="UTF-8"?>
<TextView android:id="@+id/text1"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
打开src/com/android/demo/notepad1/Notepadv1.java
package com.android.demo.notepad1;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
public class Notepadv1 extends {
private int mNoteNumber = 1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
return super.onOptionsItemSelected(item);
}
}
把 类修改成 ListActivity, ListActivity也是从Activity继承过来的。但是提供了一些额外的功能。更加适合对list进行操作。
先定义一个NotesDbAdapter成员。
在onCreate添加代码。生成一个NotesDbAdapter实例。
并调用open方法。
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.notepad_list);
mDbHelper = new NotesDbAdapter(this);
mDbHelper.open();
fillData();
}
可以看到fillData(), 这个是我们自己定义的从数据库取数据并填充到notes_row一个方法。
private void fillData()
{
Cursor c = mDbHelper.fetchAllNotes();
String[] from = new String[] {KEY_TITLE };
int [] to = new int[]{R.id.text1};
SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to);
setListAdapter(notes);
}
startManagingCursor(c)方法可以把光标的生命周期交给Android去管理。
定义一个String数组from,存放我们将显示的数据库某表里的一个列名。(这里只一个即:NotesDbAdapter.KEY_TITLE)
定义一个int数组to,存放我们将显示from数组里列内容的视图id.(如果有多个,他们将一一对应)
我们将用SimpleCursorAdapter类把数据从from映射到to
在字符串资源((under res/values/strings.xml
)增加,一个字符串
<string name="menu_insert">Add Item</string>
在Notepadv1类定义一个菜单id.
public static final int INSERT_ID = Menu.FIRST;
在onCreateOptionsMenu添加代码。
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
boolean result = super.onCreateOptionsMenu(menu);
menu.add(0, INSERT_ID, 0, R.string.menu_insert);
// TODO Auto-generated method stub
return result;
}
初始化菜单项,并添加一个项。
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// TODO Auto-generated method stub
switch(item.getItemId())
{
case INSERT_ID:
createNote();
return true;
}
return super.onOptionsItemSelected(item);
}
处理菜单项事件。
在这里只有一个菜单项要处理即:INSERT_ID,当用户点击的时候,就调用createNote();创建一个记事本。
下面看看我们自己写的方法createNote
private void createNote()
{
String noteName = "Note " + mNoteNumber++;
mDbHelper.createNote(noteName, "");
fillData();
}
它使用NotesDbAdapter的createNote方法创建一个记事本
按一下ctrl-shift-O 确保所有包都import进来了
下面可以按F11跑一下我们的程序了。
效果图如下: