loader 编写一个android_Android CursorLoader相关

介绍

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

使用CursorLoader有三个好处

改操作是在后台线程中完成的,这样处理大量数据时不会阻塞主线程。

CursorLoader可以自动更新数据,除了会执行初始化的查询操作外,CursorLoader也会对你请求的数据集合注册一个ContentObserver,当该数据集合发生变化时会调用forceLoad()函数

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值