java - read - cómo mostrar contactos en una vista de lista en Android para Android api 11+
get contacts android (1)
Lo siento si se parece a la misma pregunta un millón de veces ... pero una búsqueda en Google no ofrece resultados, solo un montón de tutoriales obsoletos que utilizan managedQuery
y otras soluciones obsoletas ...
Pasé por la capacitación de desarrolladores de Android para recuperar una lista de contactos , pero el tutorial está incompleto e incluso descargar el código de ejemplo no ayuda porque el código de ejemplo es para una manipulación más avanzada de la lista de contactos (búsqueda, etc.)
En cualquier caso, no hay ninguna razón por la que no deba haber una solución simple para esto, así que espero que alguien pueda responder aquí porque estoy seguro de que esto se ha hecho un millón de veces y estoy seguro de que docenas de otros desarrolladores principiantes de Android apreciaría esto
He seguido el tutorial a lo mejor de mi conocimiento porque no aparecen contactos. Creo que lo más importante es que TO_IDS
es una matriz entera que apunta a android.R.id.text1
. Estoy confundido sobre cómo se supone que eso de alguna manera atrae una serie de nombres de contacto.
Además, estoy confundido de por qué se necesita una vista de texto cuando el objetivo final es mostrar una vista de lista ... En el tutorial, tenemos mContactsList, que es una vista de lista ... Pero llenamos la vista de lista con un adaptador que apunta a R.layout.contact_list_item
que es solo vistas de texto rellenadas 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 muestro la lista de contactos en una vista de lista?
EDITAR: agregar 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é pongo en el contact_list_layout.xml
? ¿Esto es solo un <LinearLayout>
vacío? No está claro en el tutorial cómo se maneja este xml. Dice que este XML es el fragmento, pero si es el fragmento, ¿por qué definimos una vista de lista en el contact_list_view.xml
?
Pequeño ejemplo simplificado para mostrar el nombre de los contactos en un ListView
. Debajo del Fragment
extiende ListFragment
que tiene un diseño predeterminado. No necesitas especificar el tuyo. El diseño de los elementos de la lista también se toma de 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);
}
}