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

简介: <div class="markdown_views"><h1 id="android实训案例五四大组件之一contentprovider的使用通讯录的实现">Android实训案例(五)——四大组件之一ContentProvider的使用,通讯录的实现</h1><hr><blockquote> <p>Android四大组件是啥这里就不用多说了,看图吧,他们之间通过

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

目录
相关文章
|
5月前
|
数据库 Android开发
Android使用EditText+Listview实现搜索效果(使用room模糊查询)
本文介绍如何在Android中使用EditText与ListView实现搜索功能,并结合Room数据库完成模糊查询。主要内容包括:Room的模糊查询语句(使用`||`代替`+`号)、布局美化(如去除ListView分割线和EditText下划线)、EditText回车事件监听,以及查询逻辑代码示例。此外,还提供了相关扩展文章链接,帮助读者深入了解ListView优化、动态搜索及Room基础操作。
362 65
|
11月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
存储 Android开发 开发者
深入理解安卓应用开发的核心组件
【10月更文挑战第8天】探索Android应用开发的精髓,本文带你了解安卓核心组件的奥秘,包括Activity、Service、BroadcastReceiver和ContentProvider。我们将通过代码示例,揭示这些组件如何协同工作,构建出功能强大且响应迅速的应用程序。无论你是初学者还是资深开发者,这篇文章都将为你提供新的视角和深度知识。
|
数据可视化 Android开发 开发者
安卓应用开发中的自定义View组件
【10月更文挑战第5天】在安卓应用开发中,自定义View组件是提升用户交互体验的利器。本篇将深入探讨如何从零开始创建自定义View,包括设计理念、实现步骤以及性能优化技巧,帮助开发者打造流畅且富有创意的用户界面。
329 0
|
10月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
XML 前端开发 Java
安卓应用开发中的自定义View组件
【10月更文挑战第5天】自定义View是安卓应用开发的一块基石,它为开发者提供了无限的可能。通过掌握其原理和实现方法,可以创造出既美观又实用的用户界面。本文将引导你了解自定义View的创建过程,包括绘制技巧、事件处理以及性能优化等关键步骤。
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
343 6
|
缓存 Android开发 数据格式
Android ListView性能优化,异步加载图片
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/48184383 ListView性能优...
1218 0
|
缓存 算法 Android开发
Android 性能优化——之图片的优化
Android 性能优化——之图片的优化  在Android性能优化中,我们会发现占内存最大的和对性能影响最大的往往是图片资源,其次是控件资源。相对来说,其他的资源的影响会小一点。这里我就先对图片资源的优化进行一下讲解,如果有什么说的不对的,希望大神指正一下。
1193 0

热门文章

最新文章