Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录的实现


Android四大组件是啥这里就不用多说了,看图吧,他们之间通过intent通讯

我们后续也会一一的为大家讲解,今天就使用内容提供者ContentProvider查询系统的数据库来获取联系人,我们用listview装载

我们新建一个项目就叫MyPhone吧

并且添加权限
<uses-permission android:name="android.permission.READ_CONTACTS"/>

一,获取联系人

我们可以新建一个Class——GetPhone,这样吧,我们先在手机里创建两个联系人

GetPhone

package com.lgl.myphone;

import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.util.Log;

/**
 * 获取手机联系人
 * Created by LGL on 2016/1/24.
 */
public class GetPhone {

    //获取通讯录的方法
    public static String getPhone(Context context) {
        /**
         * 1.系统给了我们一个接口访问
         * 2.3.4.5也是查询条件,这我们并不需要
         * 并且返回一个Cursor类型的参数
         */
        Cursor query = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        //创建一个对象进行储存
        String name; //联系人
        String phone; //电话号码
        //我们获取到这些信息之后遍历出来
        while (query.moveToNext()) {
            //获取名字就需要Phone.DISPLAY_NAME
            name = query.getString(query.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            //获取num字段需要Phone.NUMBER
            phone = query.getString(query.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            Log.i("字段", name + ":" + phone);

        }
        return null;
    }

}
然后我们只要在MainActivity中调用就可以了
  //调用查询
  GetPhone.getPhone(this);
运行一下

也是成功的打印出来了

二,数据存储

我们既然要用到这些读取出来的数据,就需要先把这些数据给存储起来,我们新建一个Class类——Bean,声明一个name和一个phone,并且生成他们的set和get方法
package com.lgl.myphone;

/**
 * 数据存储
 * Created by LGL on 2016/1/24.
 */
public class Bean {

    private String name;
    private String phone;

    public Bean(String name, String phone) {
        setName(name);
        setPhone(phone);
    }

    public String getName() {
        return name;
    }

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

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

}
这样的话我们就可以去封装了,这里封装也是很简单,直接在GetPhone这个类里面声明一个list集合
 public static List<Bean>list = new ArrayList<Bean>();
然后我们可以将这个写数据装载起来
 Bean bean = new Bean(name,phone);
 list.add(bean);

三,实现自定义Adapter

考虑到这个项目的扩展性,我们的adapter一般都是自己实现继承BaseAdapter,今天,我们也来实现以下,并且放几张头像上去

ListAdapter

package com.lgl.myphone;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.List;

/**
 * Created by LGL on 2016/1/24.
 */
public class ListAdapter extends BaseAdapter {

    private List<Bean> list;
    //承接上下文
    private Context context;
    private RelativeLayout layout;

    //构造方法
    public ListAdapter(List<Bean> list, Context context) {
        this.list = list;
        this.context = context;
    }

    //返回的是集合的数量,大小
    @Override
    public int getCount() {
        return list.size();
    }

    //返回当前这条数据
    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    //获取当前的ID
    @Override
    public long getItemId(int position) {
        //id和position是相等的
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        /**
         * 我们要获取当前视图的View并且加载到视图当中
         */
        LayoutInflater inflater = LayoutInflater.from(context);
        layout = (RelativeLayout) inflater.inflate(R.layout.list_item, null);

        TextView tv_name = (TextView) layout.findViewById(R.id.tv_name);
        TextView tv_phone = (TextView) layout.findViewById(R.id.tv_phone);

        //添加内容
        tv_name.setText(list.get(position).getName());
        tv_phone.setText(list.get(position).getPhone());

        return layout;
    }
}
接着我们使用就可以了,在MainActivity中
        //初始化listview
        listview = (ListView) findViewById(R.id.listview);
        listAdapter = new ListAdapter(GetPhone.list,this);
        listview.setAdapter(listAdapter);
运行一下,就知道效果了

四,ListView的优化ViewHolder

事实上,listview的优化已经见怪不怪了,当我们的通讯录需要加载几千条数据的时候,我们就有必要的进行一些优化了,那就是使用viewholder
package com.lgl.myphone;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.List;

/**
 * Created by LGL on 2016/1/24.
 */
public class ListAdapter extends BaseAdapter {

    private List<Bean> list;
    //承接上下文
    private Context context;
    private RelativeLayout layout;

    //构造方法
    public ListAdapter(List<Bean> list, Context context) {
        this.list = list;
        this.context = context;
    }

    //返回的是集合的数量,大小
    @Override
    public int getCount() {
        return list.size();
    }

    //返回当前这条数据
    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    //获取当前的ID
    @Override
    public long getItemId(int position) {
        //id和position是相等的
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        /**
         * 我们要获取当前视图的View并且加载到视图当中
         */
//        LayoutInflater inflater = LayoutInflater.from(context);
//        layout = (RelativeLayout) inflater.inflate(R.layout.list_item, null);
//
//        TextView tv_name = (TextView) layout.findViewById(R.id.tv_name);
//        TextView tv_phone = (TextView) layout.findViewById(R.id.tv_phone);
//
//        //添加内容
//        tv_name.setText(list.get(position).getName());
//        tv_phone.setText(list.get(position).getPhone());
        ViewHolder holder;
        //==null代表并没有记载view
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null);
            holder = new ViewHolder();
            holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
            holder.tv_phone = (TextView) convertView.findViewById(R.id.tv_phone);
            //加载内容
            holder.tv_name.setText(list.get(position).getName());
            holder.tv_phone.setText(list.get(position).getPhone());
            //第一次加载完毕后标签储存
            convertView.setTag(holder);
        } else {
            //代表加载过了
            holder = (ViewHolder) convertView.getTag();
            //加载内容
            holder.tv_name.setText(list.get(position).getName());
            holder.tv_phone.setText(list.get(position).getPhone());
        }

        return convertView;
    }

    private static class ViewHolder {
        TextView tv_name;
        TextView tv_phone;
    }
}
这样子就可以数据量再大也不会出现卡顿的现象了
弱弱的说一句:今天的深圳真冷啊

Demo下载地址:http://download.csdn.net/detail/qq_26787115/9416163

Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录的实现以及ListView的优化的更多相关文章

  1. Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听

    Android实训案例(六)--四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听 Android中四大组件的使用时重中之重,我这个阶段也不奢望能把他 ...

  2. Android实训案例(八)——单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局

    Android实训案例(八)--单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局 阿法狗让围棋突然就被热议了,鸿洋大神也顺势出了篇五子棋单机游戏的视频,我看到了就像膜拜膜拜,就 ...

  3. Android实训案例(四)——关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程!

    Android实训案例(四)--关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程! 关于2048,我看到很多大神,比如医生,郭神,所以我也研究了一段时间,还好是研究 ...

  4. Android实训案例(九)——答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程

    Android实训案例(九)--答题系统的思绪,自己设计一个题库的体验,一个思路清晰的答题软件制作过程 项目也是偷师的,决心研究一下数据库.所以写的还是很详细的,各位看官,耐着性子看完,实现结果不重要 ...

  5. Android实训案例(三)——实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果!

    Android实训案例(三)--实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果! 感叹离春节将至,也同时感叹时间不等人,一年又一年,可是我依然是android道路上的小菜鸟,这篇讲 ...

  6. Android实训案例(二)——Android下的CMD命令之关机重启以及重启recovery

    Android实训案例(二)--Android下的CMD命令之关机重启以及重启recovery Android刚兴起的时候,着实让一些小众软件火了一把,切水果,Tom猫,吹裙子就是其中的代表,当然还有 ...

  7. Android实训案例(一)——计算器的运算逻辑

    Android实训案例(一)--计算器的运算逻辑 应一个朋友的邀请,叫我写一个计算器,开始觉得,就一个计算器嘛,很简单的,但是写着写着发现自己写出来的逻辑真不严谨,于是搜索了一下,看到mk(没有打广告 ...

  8. Android实训案例(七)——四大组件之一Service初步了解,实现通话录音功能,抽调接口

    Service Service的神奇之处,在于他不需要界面,一切的操作都在后台操作,所以很多全局性(手机助手,语音助手)之类的应用很长需要这个,我们今天也来玩玩 我们新建一个工程--ServiceDe ...

  9. Android实训案例(七)——四大组件之中的一个Service初步了解,实现通话录音功能,抽调接口

    Service Service的奇妙之处.在于他不须要界面,一切的操作都在后台操作,所以非常多全局性(手机助手,语音助手)之类的应用非常长须要这个.我们今天也来玩玩 我们新建一个project--Se ...

随机推荐

  1. Cartographer资料分享

    中文资料稍后补充 Introducing Cartographer By Tully Foote on October 5, 2016 10:11 AM From Damon Kohler, Wolf ...

  2. VS2008界面语言设置

    在卸载某个软件的时候,不知道什么原因导致vs2008的界面变成中文的了,但是菜单还是英文的,很不美观. 几经查找,最后可以在如下的地方设置界面语言 Tools -> Options 如果设置成 ...

  3. 13 SQLiteOpenHelper SQLiteDatabase详解

    创建数据库: 1. 创建一个类继承SQLiteOpenHelper 2. 创建继承对象 new SQLiteOpenHelper() 3. 用创建的对象获取可写或者可读的SQLiteDatabase ...

  4. mysql 字符集查看 设定

    (1) 最简单的修改方法,就是修改mysql的my.ini文件中的字符集键值, 如 default-character-set = utf8 character_set_server = utf8 修 ...

  5. BCD码与16进制互转算法

    关于这类算法,以前的文章已经讲过类似的:BCD码转二进制 #include <stdio.h> // HEX转BCD //bcd_data(<0x255,>0) unsigne ...

  6. Hibernate配置文件current_session_context_class的意思

    转自:http://shuaigg-babysky.iteye.com/blog/563423 此设置的作用如下: What does sessionFactory.getCurrentSession ...

  7. Dynamics CRM 2015 Online Update1 UI界面的更新变化

    听说出  Dynamics CRM 2015 Online  Update1了,立马跑去申请了个30天试用版简单的看了下,UI上的变化还是让人耳目一新的,也可能是被CRM2013的UI蹂躏太久了没 ...

  8. Cocos2D iOS之旅:如何写一个敲地鼠游戏(四):创建TexturePacker自动脚本

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  9. Hessian源码分析--HessianSkeleton

    HessianSkeleton是Hessian的服务端的核心,简单总结来说:HessianSkeleton根据客户端请求的链接,获取到需要执行的接口及实现类,对客户端发送过来的二进制数据进行反序列化, ...

  10. 手把手带你走进MVP +Dagger2 + DataBinding+ Rxjava+Retrofit 的世界

    0.0 Android开发现在的变化用一个词来形容就是 :翻天覆地 越来越多的项目使用了MVP + Rxjava+Retrofit +Dagger2 + DataBinding等等东西.. 但是这些东 ...