2013-08-13 8 views
17

Mi dispiace se questa sembra la stessa domanda un milione di volte ... ma una ricerca su google per questo non fornisce risultati, solo un mucchio di tutorial obsoleti utilizzando managedQuery e altre soluzioni obsolete ...come visualizzare i contatti in una listview in Android per Android api 11+

sono andato attraverso la android developer training for retrieving a contact list, ma il tutorial è incompleta e anche scaricare il codice di esempio non aiuta perché il codice di esempio è per la manipolazione lista dei contatti più avanzati (ricerca, etc.)

In ogni caso, non c'è motivo per cui non ci dovrebbe essere una soluzione semplice a questo quindi spero che qualcuno possa rispondere qui perché sono sicuro che è stato fatto un milione di volte e io sono s ne sarebbero apprezzate dozzine di altri sviluppatori Android principianti.

Ho seguito il tutorial al meglio delle mie conoscenze in assenza di contatti. Penso che la cosa più importante sia che lo TO_IDS sia un array intero che punta a android.R.id.text1. Sono confuso da come dovrebbe in qualche modo tirare una serie di nomi di contatti.

Inoltre, sono confuso perché una visualizzazione di testo è necessaria quando l'obiettivo finale è visualizzare un listview ... Nel tutorial, abbiamo mContactsList che è una visualizzazione elenco ... Ma popoliamo la visualizzazione elenco con un adattatore che punta a R.layout.contact_list_item che è solo visualizzazioni di testo popolate da TO_IDS, una matrice di numeri interi.

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); 

Cosa sto facendo male e come faccio a visualizzare semplicemente la lista dei contatti in una lista?

EDIT: aggiunta nel mio codice:

nella mia classe frammento:

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) { 

} 
} 

nel mio 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> 

nel mio 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"/> 

Nel mio contatto_ xml list_item

<?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"/> 

infine per contact_list_layout xml:

Cosa ho messo nella contact_list_layout.xml? È solo uno <LinearLayout> vuoto? Non è chiaro nel tutorial come viene gestito questo xml. Dice che questo XML è il frammento, ma se si tratta del frammento, perché abbiamo definito uno listview già nello contact_list_view.xml?

+0

'FROM_COLUMNS, TO_IDS,' colonne del database mappe al testo view id (in ogni elemento della lista), vedere [ 'SimpleCursorAdapter'] (http://developer.android.com/reference/android/widget/SimpleCursorAdapter .html # SimpleCursorAdapter% 28android.content.Context,% 20int,% 20android.database.Cursor,% 20java.lang.String [],% 20int [],% 20int% 29).Qualcosa deve caricare i dati del cursore per usarli e questo non è nel tuo snippet di codice – zapl

+0

@zapl Ho aggiunto un po 'del mio codice per mostrarti il ​​mio 'FROM_COLUMNS' e' TO_IDS' ... Ho notato che non ho un 'contact_list_layout.xml' e ho un' activity_main.xml' ... Puoi dirmi come è strutturato il 'contact_list_layout.xml'? Puoi rivedere i miei file xml? Ho la sensazione che ci sia qualcosa che mi manca e, una volta capito, funzionerà. Il tutorial non mostra come viene scritto contact_list_layout.xml, quindi forse è lì che sto facendo degli errori? –

+0

@zapl Sto ricevendo un'eccezione di puntatore nullo in 'mContactList.setAdapter (mCursorAdapter);' –

risposta

20

Piccolo esempio ridotto per la visualizzazione del nome dei contatti in un ListView. Sotto Fragment si estende ListFragment che ha un layout predefinito. Non è necessario specificare il proprio. Il layout per le voci di elenco è anche preso dai layout predefiniti di Android (android.R.layout.simple_list_item_1), che è una semplice riga di testo per 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); 
    } 
} 
+0

grazie molto aiutato, puoi dirmi come possiamo mostrare l'e-mail e il numero insieme al nome dei contatti nello stesso modo sopra? –

+0

@JagdeepSingh Non so come ottenere tutti i dati, ma l'e-mail è il più lontano possibile da quanto contenuto in [ContactsContract.Data] (http://developer.android.com/reference/android/provider/ContactsContract.Data.html) tavolo. Potrebbe essere sufficiente cambiare l'URI in quella tabella e aggiungere la colonna email + numero di telefono alla proiezione. Avrai anche bisogno di un layout personalizzato per la lista degli articoli con 3 campi di testo per il mapping 'FROM'>' TO' o per estendere l'intero 'CursorAdapter' poiché il semplice non consente di visualizzare 3 colonne in 1 campo di testo. – zapl

Problemi correlati