单声道android在listview中读取联系人和号码 [英] mono android read contact and number in listview

查看:22
本文介绍了单声道android在listview中读取联系人和号码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要一种方法来显示姓名、电话号码和图像,并将它们显示在 listView 中.

我尝试了以下代码来提取名称,但它不起作用.

<预><代码>var uri = ContactsContract.Contacts.ContentUri;字符串 [] 投影 = {ContactsContract.Contacts.InterfaceConsts.Id,ContactsContract.Contacts.InterfaceConsts.DisplayName};var cursor = ManagedQuery(uri,projection,null,null,null);var contactList = 新列表 <字符串 >();如果 (cursor.MoveToFirst()) {做 {contactList.Add(cursor.GetString(cursor.GetColumnIndex(projection[1])));} while (cursor.MoveToNext());}ListView.Adapter = new ArrayAdapter(this, Android.Resource.Layout.SimpleListItem1, contactList);

解决方案

我做了一个示例,你可以看看:

布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"机器人:方向=垂直"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"><图像视图android:id="@+id/ContactImage"android:layout_width="50dp"android:layout_height="50dp"android:layout_margin="5dp"/><线性布局android:layout_width="fill_parent"android:layout_height="fill_parent"机器人:方向=垂直"android:layout_marginLeft="5dp"><文本视图android:id="@+id/联系人姓名"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>

联系人类:

 公开课联系方式{公共长 ID { 获取;放;}公共字符串显示名称 { 获取;放;}公共字符串电话号码 { 获取;放;}公共字符串 PhotoId { 获取;放;}}

用于显示光标数据的自定义适配器:

 公共类 ContactsAdapter : BaseAdapter{列出<联系方式>联系人列表;活动活动;公共联系人适配器(活动活动){this.activity = 活动;填充联系人();}公共覆盖整数计数{得到 { 返回 contactList.Count;}}公共覆盖 Java.Lang.Object GetItem(int position){返回空;//如果需要,可以将联系人包装在 Java.Lang.Object 中以在此处返回}公共覆盖长 GetItemId(int position){返回 contactList[position].Id;}public override View GetView(int position, View convertView, ViewGroup parent){var 视图 = 转换视图 ??activity.LayoutInflater.Inflate(Resource.Layout.ContactListItem, parent, false);var contactName = view.FindViewById(Resource.Id.ContactName);var contactImage = view.FindViewById(Resource.Id.ContactImage);var contactNumber = view.FindViewById(Resource.Id.ContactNumber);contactName.Text = contactList[position].DisplayName;contactNumber.Text = contactList[position].PhoneNumber;if (contactList[position].PhotoId == null){contactImage = view.FindViewById(Resource.Id.ContactImage);contactImage.SetImageResource(Resource.Drawable.ContactImage);}别的{var contactUri = ContentUris.WithAppendedId(ContactsContract.Contacts.ContentUri, contactList[position].Id);var contactPhotoUri = Android.Net.Uri.WithAppendedPath(contactUri, Contacts.Photos.ContentDirectory);contactImage.SetImageURI(contactPhotoUri);}返回视图;}void FillContacts(){//var uri = ContactsContract.Contacts.ContentUri;var uri = ContactsContract.CommonDataKinds.Phone.ContentUri;字符串 [] 投影 = {ContactsContract.Contacts.InterfaceConsts.Id,ContactsContract.Contacts.InterfaceConsts.DisplayName,ContactsContract.CommonDataKinds.Phone.Number,ContactsContract.Contacts.InterfaceConsts.PhotoId//ContactsContract.Contacts.InterfaceConsts.PhotoThumbnailUri};//在 Honeycomb (3.0, API11) 中不推荐使用 ManagedQuery//var cursor = activity.ManagedQuery (uri,projection,null,null,null);//ContentResolver 要求您自己关闭查询//var cursor = activity.ContentResolver.Query(uri,projection,null,null,null);//在 Honeycomb (3.0, API11) 中引入的 CursorLoadervar loader = new CursorLoader(activity, uri,projection, null, null, null);var cursor = (ICursor)loader.LoadInBackground();contactList = new List();如果 (cursor.MoveToFirst()){做{contactList.Add(新联系人{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 : AppCompatActivity{protected override void OnCreate(Bundle savedInstanceState){base.OnCreate(savedInstanceState);Xamarin.Essentials.Platform.Init(this,savedInstanceState);//从主"布局资源设置我们的视图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 contactAdapter = new ContactsAdapter(this);var contactsListView = FindViewById(Resource.Id.ContactsListView);联系人列表视图.适配器 = 联系人适配器;}公共覆盖无效 OnRequestPermissionsResult(int requestCode, string[] 权限, [GeneratedEnum] Android.Content.PM.Permission[] grantResults){Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);base.OnRequestPermissionsResult(requestCode, permissions, grantResults);}}

请不要忘记请求联系人权限.

这是Github上的样例,你可以看看:

I want a way to show names and phone numbers and images and display them in listView.

I tried the following code to pull the name but it does not work.


     var uri = ContactsContract.Contacts.ContentUri;  
        string[] projection = {  
            ContactsContract.Contacts.InterfaceConsts.Id,  
            ContactsContract.Contacts.InterfaceConsts.DisplayName

        };  
        var cursor = ManagedQuery(uri, projection, null, null, null);  
        var contactList = new List < string > ();  
        if (cursor.MoveToFirst()) {  
            do {  
                contactList.Add(cursor.GetString(cursor.GetColumnIndex(projection[1])));  
            } while (cursor.MoveToNext());  
        }
            ListView.Adapter = new ArrayAdapter(this, Android.Resource.Layout.SimpleListItem1, contactList);

解决方案

I do one sample that you can take a look:

Layout:

<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 item UI:

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

Contact class:

 public class Contact
{
    public long Id { get; set; }
    public string DisplayName { get; set; }
    public string PhoneNumber { get; set; }
    public string PhotoId { get; set; }
}

Custom Adapter to display Cursor data:

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

Please don't forget to request contacts permissions.

This is the sample on Github, you can take a look:

https://github.com/CherryBu/ContactApp

More detailed info, you can take a look this article:

https://docs.microsoft.com/en-us/xamarin/android/platform/content-providers/contacts-contentprovider#displaying-the-cursor-data-with-a-custom-adapter

Update:

Setting static List in ContactsAdapter,

public static List<Contact> contactList;

Then call ListView.ItemClick event in OnCreate method.

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

The Screenshot:

这篇关于单声道android在listview中读取联系人和号码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆