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;
}