A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cemabenteng 高级黑马   /  2015-9-13 10:31  /  532 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


实现步骤

        1.创建工程,写布局文件,写ListView布局展示联系人,两个button代表获取联系人和插入联系人

        2.封装Utils工具类,封装获取联系人的方法,将结果封装到Contacts对象中存放到list集合用于ListView展示

                public class ContactsUtils {
       
                        //查询联系人
                       
                        //以后谁调这个方法谁就传一个context进来
                        public static ArrayList<Contacts> queryContacts(Context context){
                       
                                //0 创建一个集合,将数据放到集合中
                                ArrayList<Contacts> arrayList = new ArrayList<Contacts>();
               
                                // 1 通过uri解析器获取内容
                                Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");

                                // 2 查询内容 projection:查询什么内容 selection:根据什么查 selectionArgs:参数 sortOrder:排序

                                // 先查询row_contacts表的contact_id列 我们就知道一共有几条联系人
                               
                                Cursor cursor = context.getContentResolver().query(uri,
                                                new String[] { "contact_id" }, null, null, null);

                                while (cursor.moveToNext()) {

                                        String contact_id = cursor.getString(0);
                                       
                                        //创建Contacts对象

                                        Contacts contact = new Contacts();
                                       
                                        //将contact_id封装到contact对象中

                                        contact.setContact_id(contact_id);

                                        /*
                                         * contact_id就是data表的raw_contact_id,根据raw_contact_id查询data1和mimetype_id
                                         *
                                         * 当我们查data表的时候,其实查的是view_data视图,里面没有mimetype_id,只有mimetype
                                         *
                                         * mimetype代表的是代码(例如名字代码是 vnd.android.cursor.item/name)
                                         *
                                         * data1代表的内容(例如名字,电话等)
                                         */

                                        //3 根据contact_id去查询data表 查询data1列和mimetype

                                        Uri dataUri = Uri.parse("content://com.android.contacts/data");
                                       
                                        Cursor dataCursor = context.getContentResolver().query(dataUri,
                                                        new String[] { "data1", "mimetype" }, "raw_contact_id=?",
                                                        new String[] { contact_id }, null);
                                       
                                        while (dataCursor.moveToNext()) {
                                               
                                                //查询联系人信息
                                                String data1 = dataCursor.getString(0);

                                                //查询联系人信息代码
                                                String mimetype = dataCursor.getString(1);
                                               
                                                //3 根据mimetype区分data1列的数据类型

                                                if("vnd.android.cursor.item/name".equals(mimetype)){
                                                       
                                                        contact.setName(data1);//代表名字
                                                }
                                               
                                                else if("vnd.android.cursor.item/phone_v2".equals(mimetype)){
                                                       
                                                        contact.setPhone(data1);//代表电话
                                                }
                                                else if("vnd.android.cursor.item/email_v2".equals(mimetype)){
                                                       
                                                        contact.setEmail(data1);//代表邮箱
                                                }
                                                /*else if("vnd.android.cursor.item/sip_address".equals(mimetype)){
                                                        contact.setAddress(data1);
       
                                                }*/
                                        }
                                        arrayList.add(contact);
                                }
                                return arrayList;
        }

        3.在MainActivity类中设置点击事件,查询联系人
       
                //点击按钮查询联系人

                public void queryContacts(View v){
                       
                        contacts = ContactsUtils.queryContacts(getApplicationContext());
                       
                        //循环遍历获得每个联系人

                        for (Contacts contact:contacts) {
                               
                                System.out.println("contact"+contact);
                        }

        4.在MainActivity类中设置点击事件,转入插入联系人页面

                //点击按钮插入联系人

                public void insertContacts(View v){
                       
                        //创建意图对象

                        Intent intent = new Intent(this,InsertActivity.class);
                       
                        //发送意图

                        startActivity(intent);
                }

        5.新建InsertActivity类实现联系人插入,配置清单文件

                public class InsertActivity extends Activity {

                private EditText et_name;
                private EditText et_phone;
                private EditText et_email;

                @Override
                protected void onCreate(Bundle savedInstanceState) {
                        super.onCreate(savedInstanceState);

                        //设置加载布局activity_insetr
                        setContentView(R.layout.activity_insetr);

                        //1 找到控件
                        et_name = (EditText) findViewById(R.id.et_name);
                        et_phone = (EditText) findViewById(R.id.et_phone);
                        et_email = (EditText) findViewById(R.id.et_email);
                }

                        // 点击按钮 插入一条联系人信息
                        public void click(View v) {
                               
                                //获取raw_contacts路径uri

                                Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
       
                                //获取raw_contacts路径uri

                                Uri dataUri = Uri.parse("content://com.android.contacts/data");

                        //2 获取name phone email Textutils

                                String name = et_name.getText().toString().trim();
                                String phone = et_phone.getText().toString().trim();
                                String email = et_email.getText().toString().trim();

                        //判断用户输入的信息是否为空,如果为空就不保存

                        if (!(TextUtils.isEmpty(name) || TextUtils.isEmpty(phone) || TextUtils.isEmpty(email))) {

                                // 2.1 在插入联系人id的时候 先查询一下 row_contact 一共有几条数据 加+1就是联系人的id

                                        Cursor cursor = getContentResolver().query(uri, null, null, null,null);
                                        int count = cursor.getCount();
                                        int contact_id = count + 1;

                                //3 先往raw_contacts表 插入联系人的id (contact_id)

                                        ContentValues values = new ContentValues();
                                        values.put("contact_id", contact_id);
                                        getContentResolver().insert(uri, values);

                                //4 把name插入到data表

                                        ContentValues nameValues = new ContentValues();
                                        nameValues.put("data1", name);

                                // ☆ ☆ ☆ ☆ ☆ 插入的数据要告诉数据库 属于第几条联系人 和 数据类型

                                        nameValues.put("raw_contact_id", contact_id);
                                        nameValues.put("mimetype", "vnd.android.cursor.item/name");
                                        getContentResolver().insert(dataUri, nameValues);

                                // 5 把phone号码 插入到data表

                                        ContentValues phoneValues = new ContentValues();
                                        phoneValues.put("data1", phone);
                                        phoneValues.put("mimetype", "vnd.android.cursor.item/phone_v2");
                                        phoneValues.put("raw_contact_id", contact_id);
                                        getContentResolver().insert(dataUri, phoneValues);

                                // 6 把email号码 插入到data表

                                        ContentValues emailValues = new ContentValues();
                                        emailValues.put("data1", email);
                                        emailValues.put("mimetype", "vnd.android.cursor.item/email_v2");
                                        emailValues.put("raw_contact_id", contact_id);
                                        getContentResolver().insert(dataUri, emailValues);

                                Toast.makeText(getApplicationContext(), "新联系人保存成功",Toast.LENGTH_SHORT).show();
                        }

                        else {
                                Toast.makeText(getApplicationContext(), "别闹", Toast.LENGTH_SHORT).show();
                        }
                }

        6.在InsertActivity类中设置点击事件,保存成功后点击按钮返回主页面

                // 点击按钮返回主页面
                public void click1(View v) {

                        // 创建意图对象
                        Intent intent = new Intent(this, MainActivity.class);

                        // 发送意图
                        startActivity(intent);
                }
       
        7.创建MyAdapter继承BaseAdapter,实现内容信息展示到ListView上

                //创建一个adapter
                public class MyAdapter extends BaseAdapter{
                       
                        private Context context;
                        private ArrayList<Contacts> contacts;
                       

                        //根据构造方法获得要展示的数据
                        public MyAdapter(Context context,ArrayList<Contacts> contacts){

                                this.context=context;
                                this.contacts=contacts;
                        }

                        @Override
                        public int getCount() {
                               
                                return contacts.size();
                        }

                        @Override
                        public Object getItem(int position) {
                               
                                return contacts.get(position);
                        }

                        @Override
                        public long getItemId(int position) {
                               
                                return position;
                        }

                        @Override
                        public View getView(int position, View convertView, ViewGroup parent) {
                               
                                View view=null;
                               
                                //1 复用conertView

                                if(convertView!=null){
                                       
                                        view=convertView;
                                }
                                else {
                                        //resource:要转换成view对象的layout的id

                                        view=View.inflate(context, R.layout.list_item, null);
                                }
                               
                                //2 获取view上的子控件对象

                                TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
                                TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);
                                TextView tv_email = (TextView) view.findViewById(R.id.tv_email);
                               
                                //3 获取position位置条目对应的集合中的数据

                                Contacts bean = contacts.get(position);
                               
                                //4 将数据设置给这些子控件做显示

                                tv_name.setText(bean.getName());
                                tv_phone.setText(bean.getPhone());
                                tv_email.setText(bean.getEmail());
                               
                                return view;
                        }
                       
                }

        8.在MainActivity类中显示ListView

                1.找到相应控件

                2.创建Adapter对象

                        因为构造适配器MyAdapter时构造方法中传入了context和contacts,所以创建Adapter对象时要给构造方法传递参数

                        contacts在点击按钮查询联系人方法中,所以需要在点击按钮方法中创建,并且将调用者的对象this赋值给context

                        传递给构造方法

                3.将Adapter设置到ListView上

                public class MainActivity extends Activity {

                        private Context context;
                        private ArrayList<Contacts> contacts;
                        private ListView lv;
                       
                        @Override
                        protected void onCreate(Bundle savedInstanceState) {
                                super.onCreate(savedInstanceState);
                                setContentView(R.layout.activity_main);

                                context=this;
                               
                                //1 获取相应控件
                                lv = (ListView) findViewById(R.id.lv);
                               
                        }
                        //点击按钮查询联系人
                        public void queryContacts(View v){
                               
                                contacts = ContactsUtils.queryContacts(getApplicationContext());
                               
                                //循环遍历获得每个联系人
                                for (Contacts contact:contacts) {
                                       
                                        System.out.println("contact"+contact);
                                }
                               
                                //2 创建一个adapter

                                MyAdapter adapter = new MyAdapter(context, contacts);
                                               
                                //3 将adapter设置给listview

                                lv.setAdapter(adapter);
                               
                        }


1 个回复

正序浏览
layout布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity" >

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
    </ListView>
       
        <LinearLayout
            
                        android:layout_gravity="center"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:orientation="horizontal" >
                       
                <Button
                        android:layout_width="0dp"
                        android:layout_weight="1"
                        android:layout_height="wrap_content"
                        android:onClick="queryContacts"
                        android:text="获取联系人" />
               
                <Button
                        android:layout_width="0dp"
                        android:layout_weight="1"
                        android:layout_height="wrap_content"
                        android:onClick="insertContacts"
                        android:text="插入联系人" />
               
        </LinearLayout>
</LinearLayout>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入姓名" />

    <EditText
        android:id="@+id/et_phone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入电话号码" />

    <EditText
        android:id="@+id/et_email"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入邮箱" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >

        <Button
            android:id="@+id/bt_insert"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="click"
            android:text="插入" />


        <Button
            android:onClick="click1"
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginRight="18dp"
            android:text="返回" />

    </RelativeLayout>

</LinearLayout>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:baselineAligned="false"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
    android:orientation="horizontal" >
   
    <LinearLayout
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:layout_weight="1"
                >
                <TextView
                        android:layout_height="wrap_content"
                        android:layout_width="wrap_content"
                        android:text="联系人"
                        android:textColor="#0000ff"
                />
                <TextView
                        android:id="@+id/tv_name"
                        android:layout_height="wrap_content"
                        android:layout_width="wrap_content"
                        android:text="张三"
                        android:textColor="#0000ff"
                        />
               
    </LinearLayout>
   
    <LinearLayout
                        android:layout_height="match_parent"
                        android:layout_width="0dp"
                        android:layout_weight="1"
                        android:orientation="vertical"
                        >
                <TextView
                        android:layout_height="wrap_content"
                        android:layout_width="wrap_content"
                        android:text="电话"
                        android:textColor="#ff0000"
                        />
               
                <TextView
                        android:id="@+id/tv_phone"
                        android:layout_height="wrap_content"
                        android:layout_width="wrap_content"
                        android:text="12333333"
                        android:textColor="#ff0000"
                        />
               
                </LinearLayout>
               
    <LinearLayout
                        android:layout_height="match_parent"
                        android:layout_width="0dp"
                        android:layout_weight="1"
                        android:orientation="vertical"
                        >
                <TextView
                        android:layout_height="wrap_content"
                        android:layout_width="wrap_content"
                        android:text="邮件"
                        android:textColor="#00ff00"
                        />
                <TextView
                        android:id="@+id/tv_email"
                        android:layout_height="wrap_content"
                        android:layout_width="wrap_content"
                        android:text="12333333@qq.com"
                        android:textColor="#00ff00"
                        />
        </LinearLayout>

</LinearLayout>
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马