Cómo mostrar los contactos en un listview en Android para Android api 11+

Lo siento si esto parece la misma pregunta un millón de veces … pero una búsqueda de Google para esto no proporciona resultados, sólo un montón de tutoriales obsoletos utilizando managedQuery y otras soluciones obsoletas …

Fui a través de la formación de desarrolladores de Android para recuperar una lista de contactos , pero el tutorial es incompleta e incluso descargar el código de ejemplo no ayuda porque el código de ejemplo es para la manipulación de lista de contactos más avanzado (búsqueda, etc)

En cualquier caso, no hay ninguna razón por la que no debería haber una solución simple a esto, así que espero que alguien puede responder aquí porque estoy seguro de que esto se ha hecho un millón de veces y estoy seguro de que decenas de otros desarrolladores android principiante Apreciaría esto.

He seguido el tutorial a lo mejor de mi conocimiento por ningún contacto aparece. Creo que lo más importante es que TO_IDS es una matriz de números enteros que apunta a android.R.id.text1 . Estoy confundido cómo se supone que de alguna manera tirar de una serie de nombres de contacto.

Además, estoy confundido por qué un textview es necesario cuando el objetivo final es mostrar un listview … En el tutorial, tenemos mContactsList que es una vista de lista … Pero llenamos la vista de lista con un adaptador apuntando a R.layout.contact_list_item que es sólo textviews pobladas por TO_IDS, una matriz de enteros.

 mContactsList = (ListView) getActivity().findViewById(R.layout.contact_list_view); mCursorAdapter = new SimpleCursorAdapter( getActivity(), R.layout.contact_list_item, null, FROM_COLUMNS, TO_IDS, 0); mContactList.setAdapter(mCursorAdapter); 

¿Qué estoy haciendo mal y cómo simplemente mostrar la lista de contactos en un listview?

EDIT: agregando en mi código:

En mi clase de fragmento:

 public class MyFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>{ private static final String[] FROM_COLUMNS = {ContactsContract.Contacts.DISPLAY_NAME_PRIMARY }; private static final int[] TO_IDS = {android.R.id.text1}; ListView mContactList; private SimpleCursorAdapter mCursorAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ return inflater.inflate(R.layout.contact_list_view,container,false); } @Override public void onActivityCreated(Bundle savedInstanceState){ super.onActivityCreated(savedInstanceState); mContactsList = (ListView) getActivity().findViewById(R.layout.contact_list_view); mCursorAdapter = new SimpleCursorAdapter( getActivity(), R.layout.contact_list_item, null, FROM_COLUMNS, TO_IDS, 0); mContactList.setAdapter(mCursorAdapter); } @Override public Loader<Cursor> onCreateLoader(int i, Bundle bundle) { return null; } @Override public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) { } @Override public void onLoaderReset(Loader<Cursor> cursorLoader) { } } 

En mi activity_main.xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <fragment android:id ="@+id/contactListFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:name="preamble.myapp.MyFragment"/> </LinearLayout> 

En mi contact_list_view xml:

 <?xml version="1.0" encoding="utf-8"?> <ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/list" android:layout_height="match_parent" android:layout_width="match_parent"/> 

En mi contact_list_item xml

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/text1" android:layout_width="match_parent" android:layout_height="wrap_content"/> 

Finalmente para contact_list_layout xml:

¿Qué debo poner en el contact_list_layout.xml ? ¿Es esto sólo un <LinearLayout> vacío? No está claro en el tutorial cómo se trata este xml. Dice que este XML es el fragmento, pero si es el fragmento, ¿por qué definimos una listview ya en la lista contact_list_view.xml ?

Pequeño ejemplo despojado para mostrar el nombre de los contactos en un ListView . Debajo de Fragment extiende ListFragment que tiene un diseño predeterminado. No es necesario especificar el suyo propio. El diseño de los elementos de la lista también se toma en los diseños predeterminados de Android ( android.R.layout.simple_list_item_1 ), que es una simple línea de texto por elemento.

 import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract.Contacts; import android.support.v4.app.ListFragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.CursorAdapter; import android.support.v4.widget.SimpleCursorAdapter; public class ContactListFragment extends ListFragment implements LoaderCallbacks<Cursor> { private CursorAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // create adapter once Context context = getActivity(); int layout = android.R.layout.simple_list_item_1; Cursor c = null; // there is no cursor yet int flags = 0; // no auto-requery! Loader requeries. mAdapter = new SimpleCursorAdapter(context, layout, c, FROM, TO, flags); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // each time we are started use our listadapter setListAdapter(mAdapter); // and tell loader manager to start loading getLoaderManager().initLoader(0, null, this); } // columns requested from the database private static final String[] PROJECTION = { Contacts._ID, // _ID is always required Contacts.DISPLAY_NAME_PRIMARY // that's what we want to display }; // and name should be displayed in the text1 textview in item layout private static final String[] FROM = { Contacts.DISPLAY_NAME_PRIMARY }; private static final int[] TO = { android.R.id.text1 }; @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { // load from the "Contacts table" Uri contentUri = Contacts.CONTENT_URI; // no sub-selection, no sort order, simply every row // projection says we want just the _id and the name column return new CursorLoader(getActivity(), contentUri, PROJECTION, null, null, null); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { // Once cursor is loaded, give it to adapter mAdapter.swapCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { // on reset take any old cursor away mAdapter.swapCursor(null); } } 
  • ¿Cómo pasar de managedQuery a LoaderManager / CursorLoader?
  • Simple coursor adaptador con base de datos SQLite y custmize listview
  • Causado por: java.lang.IllegalArgumentException: columna '_id' no existe
  • Cómo obtener datos en OnItemClickListener desde SimpleCursorAdapter
  • Actualizar Android ListView
  • SwapCursor undefined error
  • Android: ¿Cómo poner un archivo de imagen de la tarjeta SD a HashMap con simpleadapter?
  • Implementación de una vista de lista con selección múltiple con filtro utilizando un adaptador de cursor
  • Android - ¿SimpleCursorAdapter permite múltiples diseños como BaseAdapter?
  • Utilizar SimpleCursorAdapter.ViewBinder para cambiar el color de TextView
  • Android: desplazamiento sin fin - ListView y Cursor
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.