0

我想要做的是在 ListView 中显示数据库的内容。布局包含一个我已经使用和实现的 ListView,但我似乎无法让它们一起工作(甚至光标),有人可以帮我解释一下为什么我的光标实现不起作用吗?

我有一种方法可以将数据库条目作为光标返回:

public Cursor getAllRecords() {
     return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TEXT}, null, null, null, null, null);
 }

我有一个要插入和显示数据库条目的类:

Button add;
EditText tM;
ListView generalList;
DBAdapter dba = new DBAdapter(this);

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_general);

        add = (Button) findViewById(R.id.button1);
        tM = (EditText) findViewById(R.id.editText1);
        generalList = (ListView) findViewById(R.id.generalList);

        Cursor c = dba.getAllRecords();
        c.moveToFirst();

        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.id.generalList, c, new String[] {dba.KEY_TEXT}, new int[] {R.id.generalList}, 0);
            // This doesn't seem to work for me, I don't know how to fix it
            // or how to then get it working with the ListView

        generalList.setAdapter(adapter);

        add.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                insertIntoDatabase();
            }
        });
    }

 public void insertIntoDatabase() {
     dba.open();
     dba.insertRecord(textMessage.getText().toString());
     Toast.makeText(this, "Added:\n" + tM.getText().toString(), Toast.LENGTH_LONG).show();
     dba.close();
 }
4

3 回答 3

1

如果列表仅包含 1 TextView,则可以使用android.R.layout.simple_list_item_1而不是R.id.generalList.

并将其更改new int[] {R.id.generalList}new int[] {android.R.id.text1}

像 :

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, c, new String[] {dba.KEY_TEXT}, new int[] {android.R.id.text1}, 0);
于 2012-08-29T01:25:47.827 回答
1

在接收 simplecursoraapter 的参数上,记住它接收的布局是实际项目的布局,而不是列表视图。所以从那里删除 R.id.generalList ,因为这是标识列表视图的 id 而不是完整布局。所以用包含文本视图的布局替换它。现在,在 int 数组上是 textview 的 id,它将显示您想要的文本,在字符串数组上传递从数据库读取的记录中的字段名称。按照aprian 所说的去做,并且知道您可以根据需要自定义项目。

于 2012-08-29T01:37:49.390 回答
1

当使用带有 CursorAdapter 的 ListView 时,从该列返回的 Cursor 必须包含一个具有唯一标识每一行的名称 _id 的列。我猜您要获取的一列(dba.KEY_TEXT)未命名为“_id”。您可以在表中添加一个名为 _id 的列,或者在执行 SELECT 时让数据库将名称返回为 _id

IE

SELECT col_name as _id FROM my_table;

或者

SELECT col_name _id FROM my_table;
于 2012-08-29T02:14:25.863 回答