我一直在试图用SQLite数据库中的数据填充ListView,但似乎无法解决这个问题。我在这里阅读了无数的教程和无数的帖子,但我显然没有得到批评的东西。希望有人能给我一个暗示,为什么以下两段代码不能一起工作,或者我是否应该完全看待别的东西。任何帮助,将不胜感激。我得到的结果是一个力量接近。
启动填充ListView对象的方法
public void displayNurseRoster(){
listView = (ListView) findViewById(R.id.list);
// create instance of DbCommunicator
DbCommunicator rosterView = new DbCommunicator(this);
// open instance
rosterView.open();
// instantiate SimpleCursorAdapter instance and set value
SimpleCursorAdapter cursorAdapter;
cursorAdapter = rosterView.getRosterListViewAdapter(this);
// close database instance
rosterView.close();
// set adapter to listView
listView.setAdapter(cursorAdapter);
}
返回SimpleCursorAdapter的方法:
public SimpleCursorAdapter getRosterListViewAdapter (Context context) {
// method variables
int[] to = new int[] {R.id.rosterListLname};
// used ArrayList because of unpredictability of array length
List<String> dataArray = new ArrayList<String>();
String[] columns = new String[] {KEY_NURSE_ROWID, KEY_LNAME};
// create cursor
Cursor cursor = sqldb.query(NURSE_TABLE, columns, null, null, null,
null, KEY_LNAME);
int iLname = cursor.getColumnIndex(KEY_LNAME);
cursor.moveToFirst();
String result = "";
while(!cursor.isAfterLast()){
result = result
+ cursor.getString(iLname) + "\n";
dataArray.add(result);
}
// convert ArrayList to String array for use with SimpleCursorAdapter
String [] from = (String[]) dataArray.toArray();
SimpleCursorAdapter adapter = new SimpleCursorAdapter(context,
R.layout.edit_roster, cursor, from, to);
return adapter;
}
答案 0 :(得分:2)
好的,我得到了它的工作,并希望分享,以帮助其他任何与此斗争的人2)获得有关我的修复的反馈,以防有经验的人有更好的建议。
我实际上想在列表视图中显示三个项目,所以这里的代码是有效的。我遇到的一个问题是我正在扩展ListActivity,但在另一个StackOverflow帖子中发现,当只有一个列表视图需要担心时,这不是一个好主意。
package com.deadEddie.staffingmanagement;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class EditRoster extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_roster);
displayNurseRoster();
}
public void displayNurseRoster(){
ListView listView = (ListView) findViewById(R.id.list);
int[] to = new int[] {
R.id.rosterListLname,
R.id.rosterListFname,
R.id.rosterListMI };
String[] from = new String [] {
DbCommunicator.KEY_LNAME,
DbCommunicator.KEY_FNAME,
DbCommunicator.KEY_MI};
// create instance of DbCommunicator
DbCommunicator rosterView = new DbCommunicator(this);
// open instance
rosterView.open();
// get & manage cursor
Cursor cursor = rosterView.getRosterCursor(this);
startManagingCursor(cursor);
// instantiate cursor adaptor
ListAdapter adapter = new SimpleCursorAdapter(this,
R.layout.nurse_list, cursor, from, to);
cursor.moveToNext();
// set adapter to listView
listView.setAdapter(adapter);
}// displayNurseRoster()
}
这是我的DbCommunicator类中的方法。最终产生差异的是我没有创建SQLiteQueryBuilder的实例并使用它,而是使用sqldb.query(...),如上所示。我不确定它的区别是什么,但它终于成功了。如果有人愿意分享,请做。
public Cursor getRosterCursor (Context context) {
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
queryBuilder.setTables(NURSE_TABLE);
Cursor cursor = queryBuilder.query(sqldb, new String[] {
KEY_NURSE_ROWID,
KEY_LNAME,
KEY_FNAME,
KEY_MI},
null, null, null, null, null);
return cursor;
}
其他任何人的其他新手课程: 1.始终使用&#34; _id&#34;光标中的字段。没有它,光标无法正常工作 2.简单列表视图不需要while或for循环。游标适配器处理它。 3.无需在游标上调用moveToFirst()方法。
希望对某人有所帮助。