Android Studio SQLite对listview的查询
我花了好几天的时间浏览论坛,没有找到解决办法 我试图从数据库中检索所有记录,并在列表视图中显示它们Android Studio SQLite对listview的查询,android,sqlite,listview,Android,Sqlite,Listview,我花了好几天的时间浏览论坛,没有找到解决办法 我试图从数据库中检索所有记录,并在列表视图中显示它们 public class list_loans extends Activity { ListView loanList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContent
public class list_loans extends Activity {
ListView loanList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_loans);
//Instantiate Database helper
DataBaseHelper myDbHelper = new DataBaseHelper(this);
ArrayList<personObject> myArray = new ArrayList<>();
//Open writable database
SQLiteDatabase db = myDbHelper.getWritableDatabase();
Cursor resultSet = db.rawQuery("SELECT * FROM borrower", null);
//TODO: Print out single list of item, not list for each item!**
if (resultSet != null) {
personObject myPerson = null;
if (resultSet.moveToFirst()) {
do {
String nameOut = resultSet.getString(1);
String phoneOut = resultSet.getString(2);
String addressOut = resultSet.getString(3);
Integer itemID = resultSet.getInt(4);
String itemType = resultSet.getString(5);
String itemDesc = resultSet.getString(6);
myPerson = new personObject(nameOut, phoneOut, addressOut, itemID, itemType,
itemDesc);
}while (resultSet.moveToNext());
}
myArray.add(myPerson);
loanList = (ListView) findViewById(R.id.loanList);
//TODO: loop through array and add each item to list, instead of entire array to list**
loanList.setAdapter(new listAdapter(this, myArray));
resultSet.close();
db.close();
}
}
预期产出为:
Header Item 1
Item 1 details
Header Item 2
Item 2 details
实际产量:
Header item 1
Item 1 details
Header item 2
Item 2 details
Header item 1
Item 1 details
Header item 2
Item 2 details
每次我向数据库中添加一个项目时,它都会添加另一个包含数据库中所有内容的列表项目:
添加另一项输出:
Header item 1
Item 1 details
Header item 2
Item 2 details
Header item 3
Item 3 details
Header item 1
Item 1 details
Header item 2
Item 2 details
Header item 3
Item 3 details
Header item 1
Item 1 details
Header item 2
Item 2 details
Header item 3
Item 3 details
我似乎不知道如何在列表视图中将每个项目放在它自己的单独位置。和往常一样,任何帮助都是非常感谢的……而且,我知道这个问题以前已经解决过了,但即使浏览其他帖子也没有帮助 在适配器中,更改
@Override
public Object getItem(int position) {
return data;
}
到
因为当前,getItem(int位置)
方法返回的是整个数据集,而不是请求位置的项
编辑
您期望的行为是由于您的循环造成的。请查看您的以下代码片段:
personObject myPerson = null;
if (resultSet.moveToFirst()) {
do {
String nameOut = resultSet.getString(1);
String phoneOut = resultSet.getString(2);
String addressOut = resultSet.getString(3);
Integer itemID = resultSet.getInt(4);
String itemType = resultSet.getString(5);
String itemDesc = resultSet.getString(6);
myPerson = new personObject(nameOut, phoneOut, addressOut, itemID, itemType,
itemDesc);
}while (resultSet.moveToNext());
}
myArray.add(myPerson);
//The above line of code is executed after your loop has finished.
//The result of this is that you only add the latest entry from your DB.
//Furthermore, your adapter is only displaying this data.
您的循环应该如下所示:
personObject myPerson = null;
if (resultSet.moveToFirst()) {
do {
String nameOut = resultSet.getString(1);
String phoneOut = resultSet.getString(2);
String addressOut = resultSet.getString(3);
Integer itemID = resultSet.getInt(4);
String itemType = resultSet.getString(5);
String itemDesc = resultSet.getString(6);
myPerson = new personObject(nameOut, phoneOut, addressOut, itemID, itemType,
itemDesc);
myArray.add(myPerson);
}while (resultSet.moveToNext());
}
这些更改将把数据库中的每个条目添加到列表中
编辑2
所以,在适配器中
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
if (vi == null)
vi = inflater.inflate(R.layout.row, null);
TextView text = (TextView) vi.findViewById(R.id.text);
text.setText(data.toString()); //this makes no sense. You are converting an ArrayList to String?
return vi;
}
改为
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
if (vi == null)
vi = inflater.inflate(R.layout.row, null);
TextView text = (TextView) vi.findViewById(R.id.text);
text.setText(data.get(position).getNameOut()); //Or whatever you want to display
return vi;
}
这个解决方案取得了某种进展。现在它只显示列表中的一个项目,但它只显示数据库中的最后一个项目,而不是所有项目……请查看您的基础数据。创建列表(myArray)并将适配器分配给该列表时,该列表中有什么@乔恩Smith@Jon史密斯提示:它只是列表中的一个对象。为什么?因为您循环查看结果集,但不将每个条目添加到列表中,只添加最后一个条目。我在打电话,但当我到了一个公司,我会编辑我的答案,让你看,编辑后,它会回到原来的输出。它将整个列表添加到每个列表项中,因此我将有第1项和第2项、第1项和第2项。如果我添加第三个项目,它将是项目1和项目2和项目3、项目1和项目2和项目3、项目1和项目2和项目3…向每个列表项目添加一个项目并每次添加一个新的列表项目。保留编辑1并添加编辑2@Jonshismith知道这篇文章为什么会不断降低投票率真的很有帮助。我展示了我的研究成果,它是有用的。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
if (vi == null)
vi = inflater.inflate(R.layout.row, null);
TextView text = (TextView) vi.findViewById(R.id.text);
text.setText(data.toString()); //this makes no sense. You are converting an ArrayList to String?
return vi;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
if (vi == null)
vi = inflater.inflate(R.layout.row, null);
TextView text = (TextView) vi.findViewById(R.id.text);
text.setText(data.get(position).getNameOut()); //Or whatever you want to display
return vi;
}