How To Use Android CursorLoader - Example

介绍

这篇文章给大家介绍一下android中如何使用CursorLoader。Loaders的概念是在Android3.0(API Level 11)中引入的。
使用CursorLoader有三个好处

  1. 改操作是在后台线程中完成的,这样处理大量数据时不会阻塞主线程
  2. CursorLoader可以自动更新数据,除了会执行初始化的查询操作外,CursorLoader也会对你请求的数据集合注册一个ContentObserver,当该数据集合发生变化时会调用forceLoad()函数
  3. This results in getting async callbacks anytime the data changes in order to update the view.

步骤一 创建新的android工程

在指定的路径下创建一个新的Android工程File>New>Android


这里我们创建的工程名是 CursorLoaderDemo。选择最小的SDK版本为 API 11

步骤2 FragmentActivity

继承FramentAcitity不是Acitivity 或 ActionBarActivity,实现LoaderCallBack接口。

import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.widget.ListView;
public class MainActivity extends FragmentActivity implements
LoaderCallbacks {
ListView lstContact;
CustomContactAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lstContact = (ListView) findViewById(R.id.lstContacts);
getSupportLoaderManager().initLoader(1, null, this);
}

步骤3 实现LoaderCallback接口方法

@Override
public Loader onCreateLoader(int arg0, Bundle arg1) {
return null;

}
@Override
public void onLoadFinished(Loader arg0, Cursor cursor) {
}
@Override
public void onLoaderReset(Loader arg0) {
}

更多关于LoaderCallback的信息请查看下面的链接:
http://developer.android.com/reference/android/app/LoaderManager.LoaderCallbacks.html
CursorLoader首次被调用时,onCreateLoader方法会被执行。初始化CursorLoader,请调用***initLoader(int id,Bundle bundle,Context,context)方法。

getSupportLoaderManager().initLoader(1, null, this);

步骤4 onCreateLoader()方法

现在查询android设备中所有联系人的信息话,需要在onCreateLoader方法中发起改查询

@Override
public Loader onCreateLoader(int arg0, Bundle arg1) {
Uri CONTACT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
CursorLoader cursorLoader = new CursorLoader(this, CONTACT_URI, null,
null, null, null);
return cursorLoader;
}

步骤5 给ListView设置adapter

@Override
public void onLoadFinished(Loader arg0, Cursor cursor) {
cursor.moveToFirst();
adapter = new CustomContactAdapter(this, cursor);
lstContact.setAdapter(adapter);
}

onLoadFinished,一个cursor对象被传入,这个对象中包含了所有数据,这些数据被传入CustomContactAdapter.

@Override
public void onLoaderReset(Loader arg0) {
}

onLoaderReset()当数据源改变时该方法会被调用。

步骤5 MainAcitivity.java文件

package com.tag.cursorloaderdemo;
import android.database.Cursor;

import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.widget.ListView;
public class MainActivity extends FragmentActivity implements
LoaderCallbacks {
ListView lstContact;
CustomContactAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lstContact = (ListView) findViewById(R.id.lstContacts);
getSupportLoaderManager().initLoader(1, null, this);
}
@Override
public Loader onCreateLoader(int arg0, Bundle arg1) {
Uri CONTACT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
CursorLoader cursorLoader = new CursorLoader(this, CONTACT_URI, null,
null, null, null);
return cursorLoader;
}
@Override
public void onLoadFinished(Loader arg0, Cursor cursor) {
cursor.moveToFirst();
adapter = new CustomContactAdapter(this, cursor);
lstContact.setAdapter(adapter);
}
@Override
public void onLoaderReset(Loader arg0) {
}
}

步骤7 CustomContentAdapter.java 文件

package com.tag.cursorloaderdemo;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.MediaStore;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
public class CustomContactAdapter extends BaseAdapter {
Cursor cursor;
Context mContext;
LayoutInflater inflater;
public CustomContactAdapter(Context context, Cursor cursor) {
mContext = context;
this.cursor = cursor;
inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return cursor.getCount();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
Holder holder;
cursor.moveToPosition(position);
if (view == null) {
view = inflater.inflate(R.layout.contact_list_element, parent,
false);
holder = new Holder();
holder.tvCOntactName = (TextView) view
.findViewById(R.id.tvContactName);
holder.tvContactNumber = (TextView) view
.findViewById(R.id.tvContactNumber);
holder.ivContactImage = (ImageView) view.findViewById(R.id.ivContactImage);
view.setTag(holder);
} else {
holder = (Holder) view.getTag();
}
holder.tvCOntactName.setText(cursor.getString(cursor
.getColumnIndex(Phone.DISPLAY_NAME)));
holder.tvContactNumber.setText(cursor.getString(cursor
.getColumnIndex(Phone.NUMBER)));
String imageUri = cursor.getString(cursor
.getColumnIndex(Phone.PHOTO_URI));
try {
Bitmap bitmap = MediaStore.Images.Media.getBitmap(
mContext.getContentResolver(), Uri.parse(imageUri));
holder.ivContactImage.setImageBitmap(bitmap);
scaleImage(holder.ivContactImage);
} catch (Exception e) {
holder.ivContactImage.setImageResource(R.drawable.contact);
scaleImage(holder.ivContactImage);
}
return view;
}
class Holder {
TextView tvCOntactName, tvContactNumber;
ImageView ivContactImage;
}
private void scaleImage(ImageView imageView) {
Drawable drawing = imageView.getDrawable();
if (drawing == null) {
}
Bitmap bitmap = ((BitmapDrawable) drawing).getBitmap();
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int bounding = dpToPx(50);
float xScale = ((float) bounding) / width;
float yScale = ((float) bounding) / height;
float scale = (xScale <= yScale) ? xScale : yScale;
Matrix matrix = new Matrix();
matrix.postScale(scale, scale);
Bitmap scaledBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height,
matrix, true);
width = scaledBitmap.getWidth(); // re-use
height = scaledBitmap.getHeight(); // re-use
BitmapDrawable result = new BitmapDrawable(scaledBitmap);
imageView.setImageDrawable(result);
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) imageView
.getLayoutParams();
params.width = width;
params.height = height;
imageView.setLayoutParams(params);
}
private int dpToPx(int dp) {
float density = mContext.getResources().getDisplayMetrics().density;
return Math.round((float) dp * density);
}
}

步骤8 acitivity_main.xml 文件

xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context="${relativePackage}.${activityClass}" >
android:id="@+id/lstContacts"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" >

步骤9 CustomContactAdapter 布局文件

步骤10 获取联系人读权限

步骤11 AndroidManifest.xml

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. Android(安卓)arm linux 系统调用实现
  3. Databinding简单的分析ImageView属性android:src="@{resImgId}"
  4. WebRTC之Android客户端
  5. Android数据的四种存储方式SharedPreferences、SQLite、Content
  6. Android天气预报程序(三)
  7. GreenDAO 3.x项目开发实战持续更新ing — Android(安卓)ORM框架(
  8. android操作SQLite
  9. Android数据的四种存储方式SharedPreferences、SQLite、Content

随机推荐

  1. Android入门学习四:Android系统框架
  2. 解析Android平板电脑困局:应用匮乏 定价过
  3. Android屏幕密度(Density)和分辨率的关系
  4. Android(安卓)Training - 创建一个Androi
  5. Google手机操作系统Android将100%开源
  6. 修改AVD的存放位置
  7. 第一行代码Android第一课
  8. Android(安卓)root权限获取大揭秘
  9. 1.5.20 Android(安卓)Adapter 用法总结
  10. Android(安卓)HAL层分析