0

私はListViewにSQLiteデータベースからのデータを入力しようとして頭を悩ませてきましたが、それを理解できないようです。私はここで数え切れないほどのチュートリアルと同様に数え切れないほどの投稿を読みましたが、明らかに重要なことは何も得ていません。次の2つのコードが一緒に機能しない理由、または他の何かを完全に調べる必要があるかどうかについて、誰かが私にヒントを与えることを望んでいました。どんな助けでもいただければ幸いです。私が得ている結果は、力を閉じることです。

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

1 に答える 1

2

さて、私はそれを機能させ、これに苦労している他の人を助けるために共有したいと思いました、そして2)より多くの経験を持つ人がより良い提案を持っている場合に備えて私の修正に関するフィードバックを得ます。

私は実際にリストビューに3つのアイテムを表示したかったので、これが機能したコードです。私が抱えていた問題の1つは、ListActivityを拡張していたことでしたが、別のStackOverflowの投稿で、心配するリストビューが1つしかない場合はお勧めできません。

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。常にカーソルの「_id」フィールドを使用します。それがないとカーソルは機能しません。
2.単純なリストビューでは、whileループまたはforループは必要ありません。カーソルアダプタがそれを処理します。3.カーソルでmoveToFirst()メソッドを呼び出す必要はありません。

それが誰かに役立つことを願っています。

于 2012-09-04T17:03:39.897 に答える