Z tej strony dowiesz się, jak dodać QuickContactBadge do interfejsu użytkownika i jak do niego powiązać dane. QuickContactBadge to widżet, który początkowo wyświetla się jako miniatura. Chociaż do miniatury możesz użyć dowolnego Bitmap, zwykle używasz Bitmap dekodowanego z miniatury zdjęcia kontaktu.
Mały obrazek pełni funkcję elementu sterującego. Gdy użytkownik go dotknie, QuickContactBadge rozwinie się okno zawierające:
- duży obraz,
- Duże zdjęcie powiązane z kontaktem lub, jeśli nie ma zdjęcia, grafika zastępcza.
- ikony aplikacji;
- Ikona aplikacji dla każdego elementu szczegółowych danych, które mogą być obsługiwane przez wbudowaną aplikację. Jeśli na przykład dane kontaktu obejmują co najmniej 1 adres e-mail, pojawi się ikona e-maila. Gdy użytkownicy klikną ikonę, wyświetlą się wszystkie adresy e-mail kontaktu. Gdy użytkownicy klikną jeden z adresów, aplikacja poczty e-mail wyświetli ekran do tworzenia wiadomości do wybranego adresu e-mail.
Widok QuickContactBadge zapewnia natychmiastowy dostęp do danych kontaktowych i szybki sposób na komunikację z tą osobą. Użytkownicy nie muszą szukać kontaktu, znajdować i kopiować informacji, a potem wklejać je w odpowiedniej aplikacji. Zamiast tego mogą kliknąć QuickContactBadge, wybrać metodę komunikacji, której chcą użyć, i wysłać informacje bezpośrednio do odpowiedniej aplikacji.
Dodawanie widoku QuickContactBadge
Aby dodać QuickContactBadge, wstaw w układzie element <QuickContactBadge>, jak w tym przykładzie:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> ... <QuickContactBadge android:id=@+id/quickbadge android:layout_height="wrap_content" android:layout_width="wrap_content" android:scaleType="centerCrop"/> ... </RelativeLayout>
Pobieranie danych dostawcy
Aby wyświetlić kontakt w QuickContactBadge, potrzebujesz identyfikatora URI treści dla kontaktu i Bitmap dla małego obrazu. Z kolumn pobranych z dostawcy danych kontaktów generujesz zarówno identyfikator URI treści, jak i Bitmap. Określ te kolumny jako część projekcji, której używasz do wczytywania danych do tabeli Cursor.
W przypadku Androida 3.0 (poziom interfejsu API 11) lub nowszego uwzględnij w projekcji te kolumny:
W przypadku Androida 2.3.3 (poziom interfejsu API 10) i starszych wersji należy użyć tych kolumn:
Przykłady na tej stronie zakładają, że załadowano tabelę Cursor zawierającą te kolumny i wszystkie inne wybrane kolumny. Aby dowiedzieć się, jak pobierać kolumny w zapytaniu Cursor, przeczytaj artykuł Pobieranie listy kontaktów.
Ustawianie identyfikatora URI kontaktu i miniatury
Gdy masz już niezbędne kolumny, możesz związać dane z elementem QuickContactBadge.
Ustawianie identyfikatora URI kontaktu
Aby ustawić identyfikator URI treści dla kontaktu, wywołaj funkcję getLookupUri(id,lookupKey), aby uzyskać wartość CONTENT_LOOKUP_URI, a następnie wywołaj funkcję assignContactUri(), aby ustawić kontakt. Przykład:
Kotlin
// The Cursor that contains contact rows var cursor: Cursor? = null // The index of the _ID column in the Cursor var idColumn: Int = 0 // The index of the LOOKUP_KEY column in the Cursor var lookupKeyColumn: Int = 0 // A content URI for the desired contact var contactUri: Uri? = null // A handle to the QuickContactBadge view ... cursor?.let { cursor -> /* * Insert code here to move to the desired cursor row */ // Gets the _ID column index idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID) // Gets the LOOKUP_KEY index lookupKeyColumn = cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY) // Gets a content URI for the contact contactUri = ContactsContract.Contacts.getLookupUri( cursor.getLong(idColumn), cursor.getString(lookupKeyColumn) ) binding.badge.assignContactUri(contactUri) }
Java
// The Cursor that contains contact rows Cursor cursor; // The index of the _ID column in the Cursor int idColumn; // The index of the LOOKUP_KEY column in the Cursor int lookupKeyColumn; // A content URI for the desired contact Uri contactUri; ... /* * Insert code here to move to the desired cursor row */ // Gets the _ID column index idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID); // Gets the LOOKUP_KEY index lookupKeyColumn = cursor.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY); // Gets a content URI for the contact contactUri = Contacts.getLookupUri( cursor.getLong(idColumn), cursor.getString(lookupKeyColumn) ); binding.badge.assignContactUri(contactUri);
Gdy użytkownik kliknie ikonę QuickContactBadge, w oknie pojawią się dane kontaktu.
Ustawianie miniatury zdjęcia
Ustawienie identyfikatora URI kontaktu dla opcji QuickContactBadge nie powoduje automatycznego wczytania miniatury zdjęcia kontaktu. Aby załadować zdjęcie, pobierz identyfikator URI zdjęcia z wiersza Cursor kontaktu, użyj go do otwarcia pliku zawierającego skompresowane zdjęcie miniatury i odczytaj plik do obiektu Bitmap.
Uwaga: kolumna PHOTO_THUMBNAIL_URI jest niedostępna w wersjach platformy starszych niż 3.0. W przypadku tych wersji musisz pobrać identyfikator URI z tabeli podrzędnej Contacts.Photo.
Najpierw skonfiguruj zmienne, aby uzyskać dostęp do tabeli Cursor zawierającej kolumny Contacts._ID i Contacts.LOOKUP_KEY:
Kotlin
// The column in which to find the thumbnail ID var thumbnailColumn: Int = 0 /* * The thumbnail URI, expressed as a String. * Contacts Provider stores URIs as String values. */ var thumbnailUri: String? = null ... cursor?.let { cursor -> /* * Gets the photo thumbnail column index if * platform version >= Honeycomb */ thumbnailColumn = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI) // Otherwise, sets the thumbnail column to the _ID column } else { idColumn } /* * Assuming the current Cursor position is the contact you want, * gets the thumbnail ID */ thumbnailUri = cursor.getString(thumbnailColumn) }
Java
// The column in which to find the thumbnail ID int thumbnailColumn; /* * The thumbnail URI, expressed as a String. * Contacts Provider stores URIs as String values. */ String thumbnailUri; ... /* * Gets the photo thumbnail column index if * platform version >= Honeycomb */ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { thumbnailColumn = cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI); // Otherwise, sets the thumbnail column to the _ID column } else { thumbnailColumn = idColumn; } /* * Assuming the current Cursor position is the contact you want, * gets the thumbnail ID */ thumbnailUri = cursor.getString(thumbnailColumn); ...
Zdefiniuj metodę, która pobiera dane związane ze zdjęciami dla kontaktu i wymiarów dla widoku docelowego, a następnie zwraca miniaturę o prawidłowym rozmiarze w Bitmap. Zacznij od utworzenia identyfikatora URI, który wskazuje miniaturę:
Kotlin
/** * Load a contact photo thumbnail and return it as a Bitmap, * resizing the image to the provided image dimensions as needed. * @param photoData photo ID Prior to Honeycomb, the contact's _ID value. * For Honeycomb and later, the value of PHOTO_THUMBNAIL_URI. * @return A thumbnail Bitmap, sized to the provided width and height. * Returns null if the thumbnail is not found. */ private fun loadContactPhotoThumbnail(photoData: String): Bitmap? { // Creates an asset file descriptor for the thumbnail file var afd: AssetFileDescriptor? = null // try-catch block for file not found try { // Creates a holder for the URI val thumbUri: Uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // If Android 3.0 or later, // sets the URI from the incoming PHOTO_THUMBNAIL_URI Uri.parse(photoData) } else { // Prior to Android 3.0, constructs a photo Uri using _ID /* * Creates a contact URI from the Contacts content URI * incoming photoData (_ID) */ val contactUri: Uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, photoData) /* * Creates a photo URI by appending the content URI of * Contacts.Photo */ Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY) } /* * Retrieves an AssetFileDescriptor object for the thumbnail URI * using ContentResolver.openAssetFileDescriptor */ afd = activity?.contentResolver?.openAssetFileDescriptor(thumbUri, "r") /* * Gets a file descriptor from the asset file descriptor. * This object can be used across processes. */ return afd?.fileDescriptor?.let {fileDescriptor -> // Decodes the photo file and returns the result as a Bitmap // if the file descriptor is valid BitmapFactory.decodeFileDescriptor(fileDescriptor, null, null) } } catch (e: FileNotFoundException) { /* * Handle file not found errors */ null } finally { // In all cases, close the asset file descriptor try { afd?.close() } catch (e: IOException) { } } }
Java
/** * Load a contact photo thumbnail and return it as a Bitmap, * resizing the image to the provided image dimensions as needed. * @param photoData photo ID Prior to Honeycomb, the contact's _ID value. * For Honeycomb and later, the value of PHOTO_THUMBNAIL_URI. * @return A thumbnail Bitmap, sized to the provided width and height. * Returns null if the thumbnail is not found. */ private Bitmap loadContactPhotoThumbnail(String photoData) { // Creates an asset file descriptor for the thumbnail file AssetFileDescriptor afd = null; // try-catch block for file not found try { // Creates a holder for the URI Uri thumbUri; // If Android 3.0 or later if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // Sets the URI from the incoming PHOTO_THUMBNAIL_URI thumbUri = Uri.parse(photoData); } else { // Prior to Android 3.0, constructs a photo Uri using _ID /* * Creates a contact URI from the Contacts content URI * incoming photoData (_ID) */ final Uri contactUri = Uri.withAppendedPath( ContactsContract.Contacts.CONTENT_URI, photoData); /* * Creates a photo URI by appending the content URI of * Contacts.Photo */ thumbUri = Uri.withAppendedPath( contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY); } /* * Retrieves an AssetFileDescriptor object for the thumbnail URI * using ContentResolver.openAssetFileDescriptor */ afd = getActivity().getContentResolver(). openAssetFileDescriptor(thumbUri, "r"); /* * Gets a file descriptor from the asset file descriptor. * This object can be used across processes. */ FileDescriptor fileDescriptor = afd.getFileDescriptor(); // Decodes the photo file and returns the result as a Bitmap // if the file descriptor is valid if (fileDescriptor != null) { // Decodes the bitmap return BitmapFactory.decodeFileDescriptor( fileDescriptor, null, null); } // If the file isn't found } catch (FileNotFoundException e) { /* * Handle file not found errors */ // In all cases, close the asset file descriptor } finally { if (afd != null) { try { afd.close(); } catch (IOException e) {} } } return null; }
W kodzie wywołaj metodę loadContactPhotoThumbnail(), aby uzyskać miniaturę Bitmap, i użyj jej wyniku do ustawienia miniatury zdjęcia w funkcji QuickContactBadge:
Kotlin
... /* * Decodes the thumbnail file to a Bitmap */ mThumbnailUri?.also { thumbnailUri -> loadContactPhotoThumbnail(thumbnailUri).also { thumbnail -> /* * Sets the image in the QuickContactBadge. * QuickContactBadge inherits from ImageView. */ badge.setImageBitmap(thumbnail) } }
Java
... /* * Decodes the thumbnail file to a Bitmap */ Bitmap mThumbnail = loadContactPhotoThumbnail(thumbnailUri); /* * Sets the image in the QuickContactBadge. * QuickContactBadge inherits from ImageView. */ badge.setImageBitmap(mThumbnail);
Dodawanie plakietki QuickContactBadge do widoku listy
QuickContactBadge jest przydatnym dodatkiem do elementu ListView, który wyświetla listę kontaktów. Użyj opcji
QuickContactBadge, aby wyświetlić miniaturę zdjęcia każdego kontaktu. Gdy użytkownik kliknie miniaturę, pojawi się okno QuickContactBadge.
Dodawanie elementu QuickContactBadge
Najpierw dodaj element widoku QuickContactBadge do układu produktu.
Jeśli na przykład chcesz wyświetlać QuickContactBadge i nazwę każdego pobieranego kontaktu, umieść w pliku układu następujący kod XML:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <QuickContactBadge android:id="@+id/quickcontact" android:layout_height="wrap_content" android:layout_width="wrap_content" android:scaleType="centerCrop"/> <TextView android:id="@+id/displayname" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@+id/quickcontact" android:gravity="center_vertical" android:layout_alignParentRight="true" android:layout_alignParentTop="true"/> </RelativeLayout>
W następnych sekcjach będziemy oznaczać ten plik jako contact_item_layout.xml.
Skonfiguruj niestandardowy KursorAdapter
Aby powiązać klasę CursorAdapter z klasą ListView zawierającą klasę QuickContactBadge, zdefiniuj niestandardowy adapter rozszerzający klasę CursorAdapter. Dzięki temu możesz przetwarzać dane w Cursor, zanim zwiążesz je z QuickContactBadge. Dzięki temu możesz też związać z kolumną QuickContactBadge większą liczbę kolumn Cursor. Żadna z tych operacji nie jest możliwa w zwykłym CursorAdapter.
Zdefiniowana przez Ciebie podklasa CursorAdapter musi zastąpić te metody:
CursorAdapter.newView()- Nadbija nowy obiekt
View, aby zmieścić układ elementu. W przesłonięciu tej metody przechowuj uchwyty do obiektów podrzędnychViewukładu, w tym do obiektu podrzędnegoQuickContactBadge. Dzięki takiemu podejściu unikniesz korzystania z uchwytów do obiektów podrzędnychViewza każdym razem, gdy umieszczasz nowy układ.Musisz zastąpić tę metodę, aby uzyskać uchwyty do poszczególnych obiektów podrzędnych
View. Ta metoda umożliwia kontrolowanie ich powiązania w sekcjiCursorAdapter.bindView(). CursorAdapter.bindView()- Przenosi dane z bieżącego wiersza
Cursordo podrzędnych obiektówViewukładu elementu. Musisz zastąpić tę metodę, aby można było powiązać zQuickContactBadgezarówno identyfikator URI kontaktu, jak i jego miniaturę. Domyślna implementacja umożliwia tylko mapowanie jeden-do-jednego kolumny naView.
Ten fragment kodu zawiera przykład niestandardowej podklasy CursorAdapter:
Definiowanie adaptera listy niestandardowej
Zdefiniuj podklasę klasyCursorAdapter, w tym jej konstruktor, oraz zastąpij metodynewView() i bindView():
Kotlin
/** * Defines a class that holds resource IDs of each item layout * row to prevent having to look them up each time data is * bound to a row */ private data class ViewHolder( internal var displayname: TextView? = null, internal var quickcontact: QuickContactBadge? = null ) /** * * */ private inner class ContactsAdapter( context: Context, val inflater: LayoutInflater = LayoutInflater.from(context) ) : CursorAdapter(context, null, 0) { ... override fun newView( context: Context, cursor: Cursor, viewGroup: ViewGroup ): View { /* Inflates the item layout. Stores view references * in a ViewHolder class to prevent having to look * them up each time bindView() is called. */ return ContactListLayoutBinding.inflate(inflater, viewGroup, false).also { binding -> view.tag = ViewHolder().apply { displayname = binding.displayname quickcontact = binding.quickcontact } }.root } ... override fun bindView(view: View?, context: Context?, cursor: Cursor?) { (view?.tag as? ViewHolder)?.also { holder -> cursor?.apply { ... // Sets the display name in the layout holder.displayname?.text = getString(displayNameIndex) ... /* * Generates a contact URI for the QuickContactBadge */ ContactsContract.Contacts.getLookupUri( getLong(idIndex), cursor.getString(lookupKeyIndex) ).also { contactUri -> holder.quickcontact?.assignContactUri(contactUri) } getString(photoDataIndex)?.also {photoData -> /* * Decodes the thumbnail file to a Bitmap. * The method loadContactPhotoThumbnail() is defined * in the section "Set the contact URI and thumbnail." */ loadContactPhotoThumbnail(photoData)?.also { thumbnailBitmap -> /* * Sets the image in the QuickContactBadge. * QuickContactBadge inherits from ImageView. */ holder.quickcontact?.setImageBitmap(thumbnailBitmap) } } } } } }
Java
private class ContactsAdapter extends CursorAdapter { private LayoutInflater inflater; ... public ContactsAdapter(Context context) { super(context, null, 0); /* * Gets an inflater that can instantiate * the ListView layout from the file */ inflater = LayoutInflater.from(context); ... } ... /** * Defines a class that holds resource IDs of each item layout * row to prevent having to look them up each time data is * bound to a row */ private class ViewHolder { TextView displayname; QuickContactBadge quickcontact; } ... @Override public View newView( Context context, Cursor cursor, ViewGroup viewGroup) { /* Inflates the item layout. Stores view references * in a ViewHolder class to prevent having to look * them up each time bindView() is called. */ final ContactListLayoutBinding binding = ContactListLayoutBinding.inflate(inflater, viewGroup, false); final ViewHolder holder = new ViewHolder(); holder.displayname = binding.displayName; holder.quickcontact = binding.quickContact; view.setTag(holder); return binding.root; } ... @Override public void bindView( View view, Context context, Cursor cursor) { final ViewHolder holder = (ViewHolder) view.getTag(); final String photoData = cursor.getString(photoDataIndex); final String displayName = cursor.getString(displayNameIndex); ... // Sets the display name in the layout holder.displayname = cursor.getString(displayNameIndex); ... /* * Generates a contact URI for the QuickContactBadge */ final Uri contactUri = Contacts.getLookupUri( cursor.getLong(idIndex), cursor.getString(lookupKeyIndex)); holder.quickcontact.assignContactUri(contactUri); String photoData = cursor.getString(photoDataIndex); /* * Decodes the thumbnail file to a Bitmap. * The method loadContactPhotoThumbnail() is defined * in the section "Set the contact URI and thumbnail." */ Bitmap thumbnailBitmap = loadContactPhotoThumbnail(photoData); /* * Sets the image in the QuickContactBadge. * QuickContactBadge inherits from ImageView. */ holder.quickcontact.setImageBitmap(thumbnailBitmap); }
Konfigurowanie zmiennych
W kodzie skonfiguruj zmienne, w tym projekcję Cursor, która zawiera niezbędne kolumny, jak pokazano w tym przykładzie.
Uwaga: poniższe fragmenty kodu używają metody loadContactPhotoThumbnail() zdefiniowanej w sekcji Ustawianie identyfikatora URI kontaktu i miniatury.
Kotlin
/* * Defines a projection based on platform version. This ensures * that you retrieve the correct columns. */ private val PROJECTION: Array<out String> = arrayOf( ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { ContactsContract.Contacts.DISPLAY_NAME_PRIMARY } else { ContactsContract.Contacts.DISPLAY_NAME }, if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { ContactsContract.Contacts.PHOTO_FILE_ID } else { /* * Although it's not necessary to include the * column twice, this keeps the number of * columns the same regardless of version */ ContactsContract.Contacts._ID } ) ... class ContactsFragment : Fragment(), LoaderManager.LoaderCallbacks<Cursor> { ... // Defines a ListView private val listView: ListView? = null // Defines a ContactsAdapter private val adapter: ContactsAdapter? = null ... // Defines a Cursor to contain the retrieved data private val cursor: Cursor? = null /* * As a shortcut, defines constants for the * column indexes in the Cursor. The index is * 0-based and always matches the column order * in the projection. */ // Column index of the _ID column private val idIndex = 0 // Column index of the LOOKUP_KEY column private val lookupKeyIndex = 1 // Column index of the display name column private val displayNameIndex = 3 /* * Column index of the photo data column. * It's PHOTO_THUMBNAIL_URI for Honeycomb and later, * and _ID for previous versions. */ private val photoDataIndex: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) 3 else 0 ...
Java
public class ContactsFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { ... // Defines a ListView private ListView listView; // Defines a ContactsAdapter private ContactsAdapter adapter; ... // Defines a Cursor to contain the retrieved data private Cursor cursor; /* * Defines a projection based on platform version. This ensures * that you retrieve the correct columns. */ private static final String[] PROJECTION = { ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY, (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) ? ContactsContract.Contacts.DISPLAY_NAME_PRIMARY : ContactsContract.Contacts.DISPLAY_NAME (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) ? ContactsContract.Contacts.PHOTO_FILE_ID : /* * Although it's not necessary to include the * column twice, this keeps the number of * columns the same regardless of version */ ContactsContract.Contacts._ID }; /* * As a shortcut, defines constants for the * column indexes in the Cursor. The index is * 0-based and always matches the column order * in the projection. */ // Column index of the _ID column private int idIndex = 0; // Column index of the LOOKUP_KEY column private int lookupKeyIndex = 1; // Column index of the display name column private int displayNameIndex = 3; /* * Column index of the photo data column. * It's PHOTO_THUMBNAIL_URI for Honeycomb and later, * and _ID for previous versions. */ private int photoDataIndex = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? 3 : 0; ...
Konfigurowanie widoku listy
W funkcji Fragment.onCreate() utwórz wystąpienie niestandardowego adaptera kursora i uzyskaj uchwyt do elementu ListView:
Kotlin
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return FragmentListViewBinding.inflate(...).let { binding -> ... /* * Gets a handle to the ListView in the file * contact_list_layout.xml */ listView = binding.contactList mAdapter?.also { listView?.adapter = it } ... }.root } ...
Java
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { FragmentListViewBinding binding = FragmentListViewBinding.inflate(...) ... /* * Gets a handle to the ListView in the file * contact_list_layout.xml */ if (binding.contactListView != null && adapter != null) { binding.contactListView.setAdapter(adapter); } ... } ...
W pliku onViewCreated() powiązać obiekt ContactsAdapter z obiektem ListView:
Kotlin
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) /* * Instantiates the subclass of * CursorAdapter */ mAdapter = activity?.let { ContactsAdapter(it).also { adapter -> // Sets up the adapter for the ListView listView?.adapter = adapter } } }
Java
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { ... /* * Instantiates the subclass of * CursorAdapter */ mAdapter = new ContactsAdapter(getActivity()); // Sets up the adapter for the ListView if (listView != null && mAdapter != null) { listView.setAdapter(mAdapter); } ... } ...
Gdy otrzymasz Cursor z danymi kontaktów (zwykle w pliku onLoadFinished()), zadzwoń do swapCursor(), aby przenieść dane z Cursor do ListView. Wyświetla się QuickContactBadge dla każdego wpisu na liście kontaktów.
Kotlin
override fun onLoadFinished(loader: Loader<Cursor>, cursor: Cursor) { // When the loader has completed, swap the cursor into the adapter mAdapter?.swapCursor(cursor) }
Java
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { // When the loader has completed, swap the cursor into the adapter mAdapter.swapCursor(cursor); }
Jeśli powiążesz Cursor z klasą ListView z klasą CursorAdapter (lub podklasą) i użyjesz CursorLoader do wczytania obiektu Cursor, w implementacji tej funkcji zawsze będziesz mieć jasne odwołania do Cursor.onLoaderReset()
Przykład:
Kotlin
override fun onLoaderReset(loader: Loader<Cursor>) { // Removes remaining reference to the previous Cursor adapter?.swapCursor(null) }
Java
@Override public void onLoaderReset(Loader<Cursor> loader) { // Removes remaining reference to the previous Cursor adapter.swapCursor(null); }