2013-02-22 1 views
1

Я работаю с базой данных, и я пытаюсь заполнить ListView каждой строкой таблицы. Я успешно создал и запросил данные, но я не могу заставить ничего появляться в ListView с помощью SimpleCursorAdapter.SimpleCursorAdapter для заполнения ListView

public class History extends ListActivity { 
SQLiteDatabase db; 
DbHelper DbHelper; 
ListView lv; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.history); 
    DbHelper = new DbHelper(this); 
    db = DbHelper.getWritableDatabase(); 
    lv = getListView(); 

    final String[] from = { DbHelper.TYPE, DbHelper.TITLE, DbHelper.CONTENT }; 
    final String[] column = { DbHelper.C_ID, DbHelper.TYPE, DbHelper.TITLE, 
      DbHelper.CONTENT }; 

    final int[] to = { R.id.list_row_title, R.id.list_row_content }; 
    Cursor cursor = db.query(DbHelper.TABLE_NAME, column, null, null, null, 
      null, null); 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      R.layout.history_list_row, cursor, from, to); 

    lv.setAdapter(adapter); 

    /* 
    * Display as Toast for development purposes 
    */ 
    // move to first row 
    cursor.moveToFirst(); 
    // move to the next item each time 
    while (cursor.moveToNext()) { 
     // get string and column index from cursor 
     String name = cursor 
       .getString(cursor.getColumnIndex(DbHelper.TYPE)); 
     String title = cursor.getString(cursor 
       .getColumnIndex(DbHelper.TITLE)); 
     String content = cursor.getString(cursor 
       .getColumnIndex(DbHelper.CONTENT)); 

     Toast.makeText(this, 
       "Title: " + title + "\n" + "Content: " + content, 
       Toast.LENGTH_SHORT).show(); 
    } 
    cursor.close(); 
} 

}

Это мой пользовательский ListView строка для отображения 3 строк из базы данных

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/list_row_title" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Title" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

<TextView 
    android:id="@+id/list_row_content" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Content" 
    android:textAppearance="?android:attr/textAppearanceMedium" /> 

<TextView 
    android:id="@+id/list_row_type" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Type" 
    android:textAppearance="?android:attr/textAppearanceSmall" /> 

Сообщения Тост появляются отлично, но ничего не появляется в ListView.

+3

Я не думаю, что вам следует возиться, а тем более закрыть курсор вне адаптера, поскольку он помешает позиции курсора и загрузке данных. Закрытый курсор не будет хорош внутри вашего адаптера. – ebarrenechea

+0

Вы можете передать 'null' в [' changeCursor (Cursor) '] (http://developer.android.com/reference/android/widget/CursorAdapter.html#changeCursor (android.database.Cursor)), если вы не используете ' Это нужно больше. Если вы используете ['LoaderCallbacks'] (http://developer.android.com/reference/android/app/LoaderManager.LoaderCallbacks.html), вы можете вызвать его в [' onLoaderReset() '] (http: // разработчик .android.com/reference/android/app/LoaderManager.LoaderCallbacks.html # onLoaderReset (android.content.Loader )). В противном случае не закрывайте курсор вне адаптера. Адаптер управляет самим курсором. – 2013-02-22 01:05:00

ответ

1

Я заметил здесь пару вопросов.

Во-первых,

final int[] to = { R.id.list_row_title, R.id.list_row_content }; 

должен быть

final int[] to = { R.id.list_row_type, R.id.list_row_title, R.id.list_row_content }; 

Во-вторых, вы настраиваете адаптер неправильно. Вместо того, чтобы вид списка и настройки адаптера, вы можете установить адаптер непосредственно:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
     R.layout.history_list_row, cursor, from, to); 
setListAdapter(adapter); 

В-третьих, вы закрываете курсор после цикла. не

//Closes the Cursor, releasing all of its resources and making it completely invalid. 
cursor.close(); 

Так к тому времени, просмотр списка отображаются элементы, курсор больше не имеет строки, связанные с ним

+0

Спасибо за помощь, это исправило мою проблему! У меня есть вопрос. Я следовал учебнику, в котором говорилось, что вы нажимаете close() на курсор, иначе это не сработает. Исходя из этой строки, исправлена ​​моя проблема, поэтому мой вопрос: когда подходит закрыть курсор? – ericcarboni

0

Вам нужно будет установить текст в TextView в в то время цикла.

TextView tv1=(TextView)findViewById(R.id.list_row_content); 
tv1.setText(content); 

 Смежные вопросы

  • Нет связанных вопросов^_^