Android studio 学习 之 内容提供者获得手机联系人 多布局

39 篇文章 0 订阅
效果

介绍:读取手机联系人,左边布局用recyclerview实现 右边用listview实现
最终实现点击右边字母 左边滑动到字母相应位置(scrollToPosition) 并且点击实现拨打电话功能
在这里插入图片描述
activity布局

       <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".homework.Activity">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycle"
        android:layout_weight="8"
        android:layout_width="0dp"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>
    <ListView
        android:id="@+id/listid"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent">
    </ListView>
</LinearLayout>

Phone类

public class Phone {
    public static final int TITLE=0;
    public static final int PERSON=1;
    private String name;
    private String number;
    private int type;
    private String title;

    public Phone(String name, String number, int type, String title) {
        this.name = name;
        this.number = number;
        this.type = type;
        this.title = title;
    }

    public static int getTITLE() {
        return TITLE;
    }

    public static int getPERSON() {
        return PERSON;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

适配器

    public class Myrecycleadpater extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
    private Context context;
    private ArrayList<Phone> phones;
    private OnListItemClick onListItemClick;

    public void setOnListItemClick(OnListItemClick onListItemClick) {
        this.onListItemClick = onListItemClick;
    }

    public Myrecycleadpater(Context context, ArrayList<Phone> phones) {
        this.context = context;
        this.phones = phones;
    }

    @Override
    public int getItemViewType(int position) {
        if (phones.get(position).getType()==Phone.TITLE){
            return 0;
        }else {
            return 1;
        }
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        if (i==0){
            return new Titleholder(LayoutInflater.from(context).inflate(R.layout.item_title,viewGroup,false));
        }else {
            return new Personholder(LayoutInflater.from(context).inflate(R.layout.item_person,viewGroup,false));
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, final int i) {
        if (getItemViewType(i)==0){
            Titleholder titleholder = (Titleholder) viewHolder;
             titleholder.title.setText(phones.get(i).getTitle());
        }else {
            Personholder personholder = (Personholder) viewHolder;
            personholder.name.setText(phones.get(i).getName());
            personholder.phone.setText(phones.get(i).getNumber());
        }
        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onListItemClick.OnItemClick(i);
            }
        });
    }

    @Override
    public int getItemCount() {
        return phones.size();
    }
    class Titleholder extends RecyclerView.ViewHolder{
        TextView title;
        public Titleholder(@NonNull View itemView) {
            super(itemView);
            title=itemView.findViewById(R.id.tv_title);
        }
    }
    class Personholder extends RecyclerView.ViewHolder{
        TextView name;
        TextView phone;
        public Personholder(@NonNull View itemView) {
            super(itemView);
            name = itemView.findViewById(R.id.tv_name);
            phone = itemView.findViewById(R.id.tv_phone);
        }
    }
}

适配器中的两个布局xml
recycler_item1

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="180dp">
    <ImageView
        android:id="@+id/pp_thumb"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="match_parent"
        android:src="@mipmap/ic_launcher"/>

    <LinearLayout
        android:background="#fff"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:layout_height="200dp"
        android:orientation="vertical">

        <TextView
            android:id="@+id/pp_title"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="佛山市顺德鲁粤家具厂"
            android:gravity="center"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="3dp"
            android:background="#16000000"/>

        <TextView
            android:id="@+id/pp_address"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:text="广东"
            android:textColor="#66000000"
            android:gravity="center"/>

    </LinearLayout>
</LinearLayout>

recycler_item2

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="180dp">
    <LinearLayout
        android:background="#fff"
        android:layout_height="200dp"
        android:layout_width="0dp"
        android:orientation="vertical"
        android:layout_weight="1">

        <TextView
            android:layout_height="0dp"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="佛山市顺德鲁粤家具厂"
            android:id="@+id/pp_title"/>

        <TextView
            android:background="#16000000"
            android:layout_height="3dp"
            android:layout_width="match_parent"/>

        <TextView android:layout_height="0dp"
            android:layout_width="match_parent"
            android:layout_weight="1"
            android:gravity="center"
            android:text="广东"
            android:id="@+id/pp_address"
            android:textColor="#66000000"/>

    </LinearLayout>

    <ImageView
        android:layout_height="match_parent"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:id="@+id/pp_thumb"
        android:src="@mipmap/ic_launcher"/>

</LinearLayout>

activity代码

   public class Activity extends AppCompatActivity {
    private RecyclerView recycle;
    private ListView listid;
    private ArrayList<Phone> phones = new ArrayList<>();
    private ContentResolver contentResolver;
    private String tit=null;
    private Myrecycleadpater myrecycleadpater;
    private ArrayList<String> word = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_);

        recycle = (RecyclerView) findViewById(R.id.recycle);
        listid = (ListView) findViewById(R.id.listid);

        final String[] s ={"A", "B", "C", "D", "E", "F", "G", "H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
        for (int i = 0; i <s.length; i++) {
            word.add(s[i]);
        }
        Mylistadpater mylistadpater = new Mylistadpater(this, word);
        listid.setAdapter(mylistadpater);


        if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
            requestPermissions(new String[]{Manifest.permission.READ_CONTACTS,
                    Manifest.permission.WRITE_CONTACTS
                    ,Manifest.permission.CALL_PHONE},101);
        }
        LinearLayoutManager manager = new LinearLayoutManager(this);
        recycle.setLayoutManager(manager);
        myrecycleadpater = new Myrecycleadpater(this, phones);
        recycle.setAdapter(myrecycleadpater);

        myrecycleadpater.setOnListItemClick(new OnListItemClick() {
            @Override
            public void OnItemClick(int position) {
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_CALL);
                intent.setData(Uri.parse("tel:"+phones.get(position).getNumber()));
                startActivity(intent);
            }
        });
        listid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                 String w = word.get(position);
                for (int i = 0; i < phones.size(); i++) {
                    if (phones.get(i).getTitle().equals(w)){
                        Toast.makeText(Activity.this, w, Toast.LENGTH_SHORT).show();
                        recycle.scrollToPosition(i);
                    }
                }
            }
        });

        Uri uri= ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        contentResolver = getContentResolver();
        Cursor cursor = contentResolver.query(uri, null, null, null, "phonebook_label");
        if (cursor!=null){
            while (cursor.moveToNext()){
                String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                String title=cursor.getString(cursor.getColumnIndex("phonebook_label"));
                if (title.equals(tit)){
                    phones.add(new Phone(name,number,Phone.PERSON,title));
                }else {
                    phones.add(new Phone(name,number,Phone.TITLE,title));
                    phones.add(new Phone(name,number,Phone.PERSON,title));
                    tit=title;
                }
            }
        }
        myrecycleadpater.notifyDataSetChanged();
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通过使用Android Studio中的内容提供者,我们可以轻松地实现建立手机通讯录界面并读取系统联系人的功能。 首先,我们需要创建一个新的Android项目,并在项目的布局文件中设计通讯录界面。可以包括一个ListView用于显示联系人列表,以及可选的搜索框等组件。 接下来,我们需要编写一个自定义的内容提供者。这个内容提供者将封装我们对系统联系人数据的访问。可以参考Android提供的ContactsContract类,其中包含了通讯录的数据结构和相关的查询方法。 在内容提供者中,我们需要实现读取系统联系人的功能。可以使用ContentResolver的query()方法来执行查询操作,并通过向查询结果Cursor中添加特定的列,来获取我们需要的联系人字段,如姓名、电话号码等。 接着,我们需要在通讯录界面的Activity中使用Loader来加载联系人数据。我们可以使用CursorLoader来实现这一功能,并指定要加载的数据源为我们自定义的内容提供者。 加载完成后,我们将获取到的联系人数据填充到ListView中,以展示联系人列表。可以使用SimpleCursorAdapter来帮助我们将Cursor中的数据绑定到ListView的每一项。 最后,我们可以为通讯录界面的ListView添加点击事件,当用户点击某个联系人时,可以跳转到该联系人的详细信息页面,或执行其他操作。 通过上述步骤,我们可以实现一个简单的手机通讯录界面,并成功读取系统联系人。这样,用户就可以方便地查看、搜索和管理手机通讯录中的联系人信息了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值