sobre - simplecursoradapter android ejemplo



Android: uso de SimpleCursorAdapter para obtener datos de la base de datos a ListView (2)

Al usar el formato de la base de datos en el tutorial al que se vinculó, cada fila tiene un _id , isbn , title y publisher . Ahora supongamos que desea mostrar todos los títulos en un ListView:

db = new DBAdapter(this);
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
        android.R.layout.simple_list_item_1, 
        db.getAllTitles(), 
        new String[] { "title" }, 
        new int[] { android.R.id.text1 });

ListView listView = (ListView) findViewById(R.id.list);
listView.setAdapter(adapter);

(No es necesario que recorra el cursor, ¡un adaptador hace este trabajo por usted!)

Los dos últimos parámetros en su constructor SimpleCursorAdapter son los que le falta. Son los parámetros "desde" y "hasta":

  • Queremos obtener el nombre de cada libro que está almacenado en el title nombre de la columna, aquí es donde obtenemos la información "de".
  • A continuación, debemos indicarle a dónde va "to": android.R.id.text1 es un TextView en el diseño android.R.layout.simple_list_item_1 . (Puedes revisar tu SDK y ver el archivo simple_list_item_1.xml por ti mismo o solo confía en mí por el momento).

Ahora los parámetros "de" y "a" son matrices porque podemos pasar más de una columna de información, pruebe este adaptador también:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
        android.R.layout.simple_list_item_2, 
        db.getAllTitles(), 
        new String[] { "title", "publisher" }, 
        new int[] { android.R.id.text1, android.R.id.text2 });

Con este adaptador, los libros en su base de datos se mostrarán por título y luego por editor. Todo lo que tuvimos que hacer es usar un diseño android.R.layout.simple_list_item_2 que toma dos campos y define qué columnas van a qué TextViews.

Espero que eso ayude un poco. Hay mucho más que aprender, pero tal vez esto te dé algunos conceptos básicos.

Último comentario

En la parte superior de mi cabeza, para actualizar el ListView después de agregar nuevos datos, intente esto:

public void onClick(DialogInterface dialog, int which) {
    String selection = getResources().getStringArray(R.array.markslist)[which];
    db.insertMark(date, "Default", selection);
    cursor.requery();
    adapter.notifyDataSetChanged();
}

Tendrás que definir el adapter y crear una variable para el cursor pero eso es simple:

public class Marks extends ListActivity {
    SimpleCursorAdapter adapter;
    Cursor cursor;
    DBAdapter db = new DBAdapter(this);
    ...

Y cambia getData () en consecuencia:

private void getData() {
    cursor = db.getAllMarks();
    adapter = new SimpleCursorAdapter(this, 
            android.R.layout.simple_list_item_1, 
            cursor, 
            new String[] { "value" }, 
            new int[] { android.R.id.text1 });
    ...
}

¡Buena suerte!

Estoy programando una aplicación de Android que debería usar una base de datos para almacenar datos y leerlos. Usando este tutorial (en archive.org) obtuve la aplicación para crear una base de datos y puedo crear nuevas entradas, sin embargo, no sé cómo leer la base de datos para obtener los datos almacenados en un ListView. Sé que hay muchas preguntas similares en este sitio web, pero parece que ninguna de ellas se aplica a la forma en que funciona la base de datos del tutorial.

Código:

import java.util.Calendar;

import maturarbeit.nicola_pfister.studenttools.database.DBAdapter;
import android.app.AlertDialog.Builder;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.ListView;


public class Marks extends ListActivity {

DBAdapter db = new DBAdapter(this);

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

@Override
protected void onPause() {
    super.onPause();
    db.close();
}

@Override
protected void onResume() {
    super.onResume();
    db.open();

    getData();
}

@SuppressWarnings("deprecation")
private void getData() {
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
            android.R.layout.simple_list_item_1, 
            db.getAllMarks(), 
            new String[] { "value" }, 
            new int[] { android.R.id.text1 });

    ListView listView = (ListView) findViewById(R.id.marks_list);
    listView.setAdapter(adapter);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.marks, menu);
    return true;
}

public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_add:
        Calendar cal = Calendar.getInstance();
        int day = cal.get(Calendar.DAY_OF_MONTH);
        int month = cal.get(Calendar.MONTH);
        final String date = day + "." + month;
        Builder builder = new Builder(this);
        builder
            .setTitle(R.string.dialog_addmarks)
            .setItems(R.array.markslist, new OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    @SuppressWarnings("unused")
                    long id;
                    String selection = getResources().getStringArray(R.array.markslist)[which];
                    id = db.insertMark(date, "Default", selection);
                    }
            })
            .show();
        getData();
        break;
    case R.id.menu_delete:
            //Deleting function yet to be implemented.
        break;
    }
    return super.onOptionsItemSelected(item);
}
}

Edición: el ID de ListView estaba equivocado ya que tenía que ser android: list.


Answer #1

No se usa un adaptador en cada elemento del cursor, se crea un adaptador para todo el cursor. Puede configurar esta vista de lista para usar ese cursor. Prueba algunos tutoriales de SimpleCursorAdapter como this





simplecursoradapter