Я делаю один пример, который вы можете посмотреть:
Макет:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView android:id="@+id/ContactsListView"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
Интерфейс элемента ListView:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/ContactImage"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="5dp" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:layout_marginLeft="5dp">
<TextView
android:id="@+id/ContactName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
/>
<TextView android:id="@+id/ContactNumber"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</LinearLayout>
Класс контакта:
public class Contact
{
public long Id { get; set; }
public string DisplayName { get; set; }
public string PhoneNumber { get; set; }
public string PhotoId { get; set; }
}
Пользовательский адаптер для отображения данных курсора:
public class ContactsAdapter : BaseAdapter
{
List<Contact> contactList;
Activity activity;
public ContactsAdapter(Activity activity)
{
this.activity = activity;
FillContacts();
}
public override int Count
{
get { return contactList.Count; }
}
public override Java.Lang.Object GetItem(int position)
{
return null; // could wrap a Contact in a Java.Lang.Object to return it here if needed
}
public override long GetItemId(int position)
{
return contactList[position].Id;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
var view = convertView ?? activity.LayoutInflater.Inflate(Resource.Layout.ContactListItem, parent, false);
var contactName = view.FindViewById<TextView>(Resource.Id.ContactName);
var contactImage = view.FindViewById<ImageView>(Resource.Id.ContactImage);
var contactNumber = view.FindViewById<TextView>(Resource.Id.ContactNumber);
contactName.Text = contactList[position].DisplayName;
contactNumber.Text = contactList[position].PhoneNumber;
if (contactList[position].PhotoId == null)
{
contactImage = view.FindViewById<ImageView>(Resource.Id.ContactImage);
contactImage.SetImageResource(Resource.Drawable.ContactImage);
}
else
{
var contactUri = ContentUris.WithAppendedId(ContactsContract.Contacts.ContentUri, contactList[position].Id);
var contactPhotoUri = Android.Net.Uri.WithAppendedPath(contactUri, Contacts.Photos.ContentDirectory);
contactImage.SetImageURI(contactPhotoUri);
}
return view;
}
void FillContacts()
{
//var uri = ContactsContract.Contacts.ContentUri;
var uri = ContactsContract.CommonDataKinds.Phone.ContentUri;
string[] projection = {
ContactsContract.Contacts.InterfaceConsts.Id,
ContactsContract.Contacts.InterfaceConsts.DisplayName,
ContactsContract.CommonDataKinds.Phone.Number,
ContactsContract.Contacts.InterfaceConsts.PhotoId
//ContactsContract.Contacts.InterfaceConsts.PhotoThumbnailUri
};
// ManagedQuery is deprecated in Honeycomb (3.0, API11)
//var cursor = activity.ManagedQuery (uri, projection, null, null, null);
// ContentResolver requires you to close the query yourself
//var cursor = activity.ContentResolver.Query(uri, projection, null, null, null);
// CursorLoader introduced in Honeycomb (3.0, API11)
var loader = new CursorLoader(activity, uri, projection, null, null, null);
var cursor = (ICursor)loader.LoadInBackground();
contactList = new List<Contact>();
if (cursor.MoveToFirst())
{
do
{
contactList.Add(new Contact
{
Id = cursor.GetLong(cursor.GetColumnIndex(projection[0])),
DisplayName = cursor.GetString(cursor.GetColumnIndex(projection[1])),
PhoneNumber = cursor.GetString(cursor.GetColumnIndex(projection[2])),
PhotoId = cursor.GetString(cursor.GetColumnIndex(projection[3]))
});
} while (cursor.MoveToNext());
}
}
}
MainActivity:
public class MainActivity : AppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.layout4);
if (ActivityCompat.CheckSelfPermission(this, Android.Manifest.Permission.ReadContacts) != Android.Content.PM.Permission.Granted)
{
ActivityCompat.RequestPermissions(this, new string[] { Android.Manifest.Permission.ReadContacts }, 1);
}
var contactsAdapter = new ContactsAdapter(this);
var contactsListView = FindViewById<ListView>(Resource.Id.ContactsListView);
contactsListView.Adapter = contactsAdapter;
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
Пожалуйста, не забудьте запросить разрешения для контактов.
This это образец на Github, вы можете посмотреть:
https://github.com/CherryBu/ContactApp
Более подробную информацию, вы можете посмотреть эту статью:
https://docs.microsoft.com/en-us/xamarin/android/platform/content-providers/contacts-contentprovider#displaying -курсор-данные-с-адаптером
Обновление:
Настройка состояния c Список в ContactsAdapter,
public static List<Contact> contactList;
Затем вызовите событие ListView.ItemClick в методе OnCreate.
contactsListView.ItemClick += ContactsListView_ItemClick;
private void ContactsListView_ItemClick(object sender, AdapterView.ItemClickEventArgs e)
{
string selectnumber = ContactsAdapter.contactList[e.Position].PhoneNumber;
var toast = Toast.MakeText(this, selectnumber, Android.Widget.ToastLength.Short);
toast.Show();
}
Снимок экрана:
![enter image description here](https://i.stack.imgur.com/4wz5s.gif)