Listview con CursorAdapter

Estoy desarrollando una aplicación que muestra los contactos del teléfono con CursorAdapter. Cuando lo ejecuto, me enfrenté con una vista de lista que repitió sólo un contacto como abajo ("david" es uno de mis contactos, sólo se repite en listview)

David 017224860

David 017224860

David 017224860

David 017224860

David 017224860

David 017224860.

.

.

.

Mi actividad parece

public class Contacts extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.contacts); Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,null, null); startManagingCursor(cursor); ContactCursorAdapterCT adapter= new ContactCursorAdapterCT(Contacts.this, cursor); ListView contactLV = (ListView) findViewById(R.id.listviewblcontactsDB); contactLV.setAdapter(adapter); 

Y mi cursorAdapter se parece a:

 public class ContactCursorAdapterCT extends CursorAdapter { public ContactCursorAdapterCT(Context context, Cursor c) { super(context, c); // TODO Auto-generated constructor stub } @Override public void bindView(View view, Context context, Cursor cursor) { while (cursor.moveToNext()) { TextView name = (TextView)view.findViewById(R.id.blacklistDB1); name.setText(cursor.getString(cursor.getColumnIndex (ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))); TextView phone = (TextView)view.findViewById(R.id.blacklistDB2); phone.setText(cursor.getString(cursor.getColumnIndex (ContactsContract.CommonDataKinds.Phone.NUMBER))); } } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { // TODO Auto-generated method stub LayoutInflater inflater = LayoutInflater.from(context); View v = inflater.inflate(R.layout.lv, parent, false); bindView(v, context, cursor); return v; } 

Noté algunos puntos:

  1. Un CursorAdapter mueve el Cursor para usted, saque su llamada a cursor.moveToNext() .
  2. El adaptador getView() llama a newView() y bindView() por sí mismo; Usted no debe llamar a estos métodos usted mismo.
  3. Debe ver las conferencias del desarrollador de Android en Google IO para aprender consejos y trucos sobre cómo acelerar su adaptador. Consejos como:
    • Utilizar un ViewHolder, en lugar de llamar a findViewById() repetidamente.
    • Guardando los índices de su Cursor, en lugar de llamar a getColumnIndex() repetidamente.
    • Recuperar LayoutInflater una vez y mantener una referencia local.

También, sugiero que cambies de usar CursorManager a usar CursorLoader. Esto se documenta en la guía de la API de Android, bajo Cargadores. Un ejemplo específico que puede ser útil es aquí .

Un Adaptador de Cursor "conecta" un Cursor a un ListView. El Cursor es una vista de datos de los datos, y el ListView es una vista de interfaz de usuario de los mismos datos. No es necesario programar nada para que el ListView permanezca sincronizado con el Cursor, eso es todo manejado automáticamente.

Debe indicarle a ListView qué columnas debe mostrar el cursor, consulte la documentación de la clase SimpleCursorAdapter . Normalmente uso esa clase a menos que tenga que modificar los datos a medida que los muevo desde el Cursor al ListView.

  • ListView con Viewpager como un encabezado dentro de TabPageIndicator
  • ListView onItemClick sólo obtiene el primer elemento
  • Seleccione varios elementos de listview y cambie el color del elemento seleccionado solamente
  • Android: ¿Qué es inflater en listview?
  • No se puede convertir de android.app.FragmentManager a android.support.v4.app.FragmentManager
  • Custom ListView donde todas las imágenes tienen el mismo tamaño
  • ChrisBanes PullToRefresh 'Cargando ...' issue
  • ¿Cómo obtener ViewSwitcher para envolver sólo la altura de vista actualmente visualizada?
  • Crash on hidden Vista
  • La vista setVisibility (GONE) se vuelve invisible pero todavía ocupa espacio
  • Android: mantiene el elemento de ListView resaltado una vez que se ha hecho clic en él.
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.