在我的应用中,我使用以下代码填充ListView:
// Populate the ListView w/ all rows
Cursor data = appDBHelper.getAppDataAllBonuses();
listView.setAdapter(new SimpleCursorAdapter(this, R.layout.bonus_list_row_item, data,
new String[] {"sCode", "sName", "sCategory", "sCity", "sState"},
new int[] {R.id.bonusListCode, R.id.bonusListName, R.id.bonusListCategory, R.id.bonusListCity, R.id.bonusListState}, 0));
一旦我连续点击一下,我就转到一个新的Intent,在这个新的Intent中,我有一系列TextView,它们需要显示与上述相同的信息。
我发现this answer,这似乎是正确的方法,但是我仍然不确定如何用数据库中的数据填充布局。
由于ListAdapter似乎不适用,如何用游标中的数据填充TextView?
(注意,我没有在代码中使用OnClickListener
,因为我实际上并未点击ListView行本身。而是使用FrameLayout允许根据左或右触发不同的意图点击该行的一侧)。
编辑:这是我的AppDBAdapter:
public class AppDataDBHelper extends SQLiteOpenHelper {
private static String TAG = "AppDataDBHelper"; // Tag just for the LogCat window
private static String DB_NAME ="appdata.db";
private static String DB_TABLE = "Bonus_Data";
private static int DB_VERSION = 1;
private SQLiteDatabase mDataBase;
private final Context mContext;
public AppDataDBHelper(Context context) {
super(context, DB_NAME, null,DB_VERSION);
this.mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void createDataBase() throws IOException {
Log.e(TAG,"Entered createDatabase");
boolean mDataBaseExist = checkDataBase();
if(!mDataBaseExist) {
this.getReadableDatabase();
this.close();
try {
//Copy the database from assets
copyDataBase();
Log.e(TAG, "createDatabase database created");
} catch (IOException mIOException) {
throw new Error("ErrorCopyingDataBase");
}
}
}
//See if DB exists in userspace
private boolean checkDataBase() {
Log.e(TAG,"entered checkDatabase");
File dbFile = new File(mContext.getDatabasePath(DB_NAME).getPath());
if (dbFile.exists()) return true;
Log.e(TAG,"dbFile = true");
File dbDir = dbFile.getParentFile();
if (!dbDir.exists()) {
Log.e(TAG,"dbFile = false");
dbDir.mkdirs();
}
return false;
}
//Copy the database from assets to userspace
private void copyDataBase() throws IOException {
InputStream mInput;
OutputStream mOutput;
String outFileName = mContext.getDatabasePath(DB_NAME).getPath();
try {
mInput = mContext.getAssets().open(DB_NAME);
mOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = mInput.read(buffer)) > 0) {
mOutput.write(buffer, 0, length);
}
mOutput.flush();
mOutput.close();
mInput.close();
} catch (IOException ie) {
throw new Error("copyDatabase() Error");
}
}
//Open the database, so we can query it
public boolean openDataBase() throws SQLException
{
String mPath = DB_NAME;
//Log.v("mPath", mPath);
mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
return mDataBase != null;
}
public Cursor getAppDataFilteredBonuses() {
SQLiteDatabase db = this.getWritableDatabase();
Cursor data = db.rawQuery("SELECT hMy as _id,* FROM " + DB_TABLE + " WHERE sState = 'CA'", null);
return data;
}
public Cursor getAppDataTrophyRuns() {
SQLiteDatabase db = this.getWritableDatabase();
Cursor data = db.rawQuery("SELECT hMy as _id,* FROM " + DB_TABLE + " WHERE sTrophyGroup IS NOT NULL GROUP BY sTrophyGroup", null);
return data;
}
public Cursor getAppDataAllBonuses() {
SQLiteDatabase db = this.getWritableDatabase();
Cursor data = db.rawQuery("SELECT hMy as _id,* FROM " + DB_TABLE + " ORDER BY sCode", null);
return data;
}
public Cursor getAppDataSelectedBonus(String id) {
SQLiteDatabase db = this.getWritableDatabase();
String [] args={id};
Cursor data = db.rawQuery("SELECT hMy as _id,* FROM " + DB_TABLE + " WHERE sCode = ? ORDER BY sCode", args);
return data;
}
public Cursor getAppDataListContents() {
SQLiteDatabase db = this.getWritableDatabase();
Cursor data = db.rawQuery("SELECT hMy as _id,* FROM " + DB_TABLE, null);
return data;
}
@Override
public synchronized void close()
{
if(mDataBase != null)
mDataBase.close();
super.close();
}
}