可顯示資料庫內的資料於頁面 , 進行勾選後顯示於表單標題上 , 這題的重點在DataBase的存取 , 還有為了要讓嵌在List RowView內的CheckBox能引發事件 , 我們還要額外去Custom Adapter , 這個做法是去 extends Adapter , 程式碼如下。
package COM.TQC.GDD02;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
public class GDD02 extends Activity
{
SQLiteDatabase dataBase;
Cursor cursor;
Button exitButton , okButton;
ListView listview;
boolean[] CB = new boolean[3];
String DATABASENAME = "MyDB";
String TABLENAME = "MyTB";
String FIELD01_ID = "_id";
String FIELD02_NOTE = "note";
String FIELD03_CREATED = "created";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
dataBase = this.openOrCreateDatabase(DATABASENAME, MODE_PRIVATE, null);
try
{
cursor = dataBase.rawQuery("SELECT * FROM "+TABLENAME, null);
}catch(SQLiteException SQLiteException)
{
//如果Table MyTB 不存在的話 , 新增Table , 新增資料
String create = "create table if not exists "+TABLENAME+" ("+FIELD01_ID+" integer primary key autoincrement, "+FIELD02_NOTE+" varchar not null, "+FIELD03_CREATED+" INTEGER)";
dataBase.execSQL(create);
dataBase.execSQL("INSERT INTO "+TABLENAME+" ("+FIELD02_NOTE+","+FIELD03_CREATED+") values ('BOOK',10)");
dataBase.execSQL("INSERT INTO "+TABLENAME+" ("+FIELD02_NOTE+","+FIELD03_CREATED+") values ('FOOD',10)");
dataBase.execSQL("INSERT INTO "+TABLENAME+" ("+FIELD02_NOTE+","+FIELD03_CREATED+") values ('TOOL',10)");
cursor = dataBase.rawQuery("SELECT * FROM "+TABLENAME, null);
Log.d("Test", "SQLiteException");
}
exitButton = (Button) this.findViewById(R.id.button2);
exitButton.setOnClickListener(BOnClickListener);
okButton = (Button) this.findViewById(R.id.button1);
okButton.setOnClickListener(BOnClickListener);
listview = (ListView) this.findViewById(R.id.listView1);
myAdapter adapter = new myAdapter(cursor , CB);
listview.setAdapter(adapter);
}
public Button.OnClickListener BOnClickListener = new Button.OnClickListener()
{
@Override
public void onClick(View v)
{
String temp="";
int count=0;
switch(v.getId())
{
case R.id.button1:
for(int i=0;i<3;i++)
{
if(CB[i])
{
count++;
cursor.moveToPosition(i);
temp+=cursor.getString(1)+" ";
}
}
if(count>0) GDD02.this.setTitle("{"+temp+"}");
else GDD02.this.setTitle(R.string.app_name);
break;
case R.id.button2:
finish();
break;
}
}
};
public class myAdapter extends BaseAdapter
{
Cursor myAdapterCursor;
boolean[] myAdapterCB;
public myAdapter(Cursor c , boolean[] cb)
{
myAdapterCB = cb;
myAdapterCursor = c;
myAdapterCursor.moveToFirst();
}
public View getView(final int position, View convertView, ViewGroup parent)
{
View rowview = convertView;
if (rowview == null)
{
LayoutInflater inflater = getLayoutInflater();
rowview = inflater.inflate(R.layout.list, parent, false);
//為了要把xml所描述的Layout轉變為View , 也就是我們要的rowview
//所以必須使用LayoutInflater來轉化 , 而要取得LayoutInflater的Instance方式還包括
//LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//接著再使用inflate (int resource, ViewGroup root, boolean attachToRoot)
//傳回我們要的rowview
}
TextView notes = (TextView) rowview.findViewById(R.id.textView1);
myAdapterCursor.moveToPosition(position);
notes.setText(myAdapterCursor.getString(1));
CheckBox checkBox = (CheckBox) rowview.findViewById(R.id.checkBox1);
checkBox.setChecked(false);
/*
每個list rowview都有擺放一個CheckBox,為了當我們按下CheckBox的時候要做出
事件反應 , 所以針對每個rowview上的CheckBox我們都將他設定 onClick(View arg0)的事件宣告
*/
checkBox.setOnClickListener(new CheckBox.OnClickListener()
{
@Override
public void onClick(View arg0)
{
if(((CheckBox) arg0).isChecked()) myAdapterCB[position]= true;
else myAdapterCB[position] = false;
}
});
return rowview;
}
@Override
public int getCount()
{
// TODO Auto-generated method stub
return myAdapterCursor.getCount();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
myAdapterCursor.moveToPosition(position);
return myAdapterCursor.getString(1);
}
@Override
public long getItemId(int position)
{
// TODO Auto-generated method stub
myAdapterCursor.moveToPosition(position);
return myAdapterCursor.getLong(0);
}
}
@Override
protected void onDestroy()
{
// TODO Auto-generated method stub
if(dataBase.isOpen()) dataBase.close();
super.onDestroy();
}
}
再來是List RowView的 Layout檔
接著是main.xml檔
P.S. 題目中所要求的Variable和Method皆會保留 , 也會根據題目所要求的流程去實作 , 縱使題目要求繞遠路....


沒有留言:
張貼留言