文档章节

CursorLoader加载器读取手机联系人的简单记录(17)

f
 flyqilong
发布于 2016/02/21 21:46
字数 694
阅读 31
收藏 0
package com.example.andday17cursorloader_contacts;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.Menu;
import android.view.MenuItem;

import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SearchView.OnQueryTextListener;

public class MainActivity extends FragmentActivity implements
		LoaderCallbacks<Cursor> {
	// // 操作手机通讯录
	// private String uri_contacts = "content://com.android.contacts/contacts";
	// private String uri_raw_contacts =
	// "content://com.android.contacts/raw_contacts";
	// private String uri_data = "content://com.android.contacts/data";
	// private String uri_data_phone =
	// "content://com.android.contacts/data/phones";
	// private String uri_data_email =
	// "content://com.android.contacts/data/emails";
	private ListView listview;
	private LoaderManager loaderManager;
	private SimpleCursorAdapter adapter;
	private String uri_raw_contacts = "content://com.android.contacts/raw_contacts";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listview = (ListView) this.findViewById(R.id.listview);
		loaderManager = getSupportLoaderManager();
		loaderManager.initLoader(1, null, this);
		adapter = new SimpleCursorAdapter(this, R.layout.item_listview, null,
				new String[] { "_id", "display_name" }, new int[] {
						R.id.text_id, R.id.text_displayname },
				CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
		listview.setAdapter(adapter);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		// 相当于得到这个视图(布局文件),放到menu里面,(menu文件夹的控件获取方法)
		// 再通过view跟findViewById()类似,通过查找控件id,查找出SearchVeiw
		MenuItem item = menu.findItem(R.id.action_searchview);// 查找出SearchVeiw所在的item
		SearchView searchview = (SearchView) item.getActionView();
		// 用SearchView时要将版本给位11,否则会一直显示检查错误
		searchview.setOnQueryTextListener(new OnQueryTextListener() {

			@Override
			public boolean onQueryTextSubmit(String query) {
				return false;
			}

			@Override
			public boolean onQueryTextChange(String keywords) {
				// 点击的时候弹出搜索输入文本框,将数据传给onCreateLoader()加载器加载数据
				Bundle bundle = new Bundle();
				bundle.putString("keywords", keywords);
				loaderManager.restartLoader(1, bundle, MainActivity.this);// 重新查询
				return false;
			}
		});
		return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case R.id.action_contacts:// 显示联系人界面
			Intent intent = new Intent();
			intent.setAction("com.android.contacts.action.LIST_CONTACTS");
			startActivity(intent);
			break;
		case R.id.action_restore:// 恢复被删除的联系人
			// 将deleted=0,即修改为0后代表都恢复了 通过ContentProvider修改raw_contacts表
			ContentResolver resolver = getContentResolver();
			ContentValues values = new ContentValues();
			// 修改添加等要通过ContentValues
			values.put("deleted", "0");
			int count = resolver.update(Uri.parse(uri_raw_contacts), values,
					"deleted=1", null);
			// 大于0代表删除成功了
			if (count > 0) {
				loaderManager.restartLoader(1, null, MainActivity.this);
			}
			break;
		}
		return super.onOptionsItemSelected(item);
	}

	@Override
	public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {
		// 注意:new CursorLoader()其实就是主线程,不要以为没有,只是CursorLoader内部封装运行了
		if (bundle == null) {// 没有条件则查询全部 没有被删除的联系人,投影查询两个加字段就行了,id跟displayname
			return new CursorLoader(this, Uri.parse(uri_raw_contacts),
					new String[] { "_id", "display_name" }, "deleted=0", null,
					null);
		} else {// keywords是你输入时SearchView传过来的
			// 注意:这里keywords要放到这里,因为如果这里不执行的话,会多于,不要放在if上面
			String keywords = bundle.getString("keywords");
			return new CursorLoader(this, Uri.parse(uri_raw_contacts),
					new String[] { "_id", "display_name" }, "display_name like ?",
					new String[] { keywords + "%" }, null);
		}

	}

	@Override
	public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
		adapter.changeCursor(cursor);
	}

	@Override
	public void onLoaderReset(Loader<Cursor> loader) {
		adapter.changeCursor(null);
	}
}
//布局
    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
//listview里面自定义的布局
    <TextView
        android:id="@+id/text_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <TextView
        android:id="@+id/text_displayname"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />


© 著作权归作者所有

f
粉丝 3
博文 93
码字总数 53900
作品 0
Android工程师
私信 提问
Android Loader 机制,让你的数据加载更加高效

前言 在 Android 中,任何耗时的操作都不能放在 UI 线程中,所以耗时的操作都需要使用异步加载来实现。其实,加载耗时数据的常用方式其实也挺多的,就让我们来看一下 1、Thread + Handler Th...

developerHaoz
2017/11/27
0
0
android loader 详解

装载器从android3.0开始引进。它使得在activity或fragment中异步加载数据变得简单。装载器具有如下特性: 它们对每个Activity和Fragment都有效。 他们提供了异步加载数据的能力。 它们监视数...

等待流星
2014/03/13
0
0
Android 装载器---使用LoaderManager的回调方法

LoaderManager.LoaderCallbacks是一个让客户与LoadManager进行交互的回调接口。 装载器,尤其是CursorLoader装载器,被期望用来保存被终止后的数据,这样就允许应用程序在Activity之间或Fra...

长平狐
2012/10/16
429
0
Android 装载器---概要

在Android3.0中引入了装载器的功能,这使它很容易在Activity或Fragment中使用异步的方式加载数据。装载器的特点如下: 1. 装载器对于每个Activity和Fagment都是有效的; 2. 装载器提供异步数...

长平狐
2012/10/16
41
0
Android 装载器---在应用程序中使用装载器

这一节描述了在Android应用程序中如何使用装载器,使用装载器的应用程序通常包括以下内容: 1. 一个Activity或Fragment; 2. 一个LoaderManager实例; 3. 一个用于加载通过ContentProvider保...

长平狐
2012/10/16
85
0

没有更多内容

加载失败,请刷新页面

加载更多

怎么升级phpstudy中的php版本

http://www.php.cn/jishu/php/413274.html php官网 下载php版本 https://windows.php.net/

15834278076
13分钟前
0
0
文件已删除但句柄没有释放导致磁盘空间用完

有时候会发现linux文件系统分区已经快满了,但又找不到到底是什么文件占用了磁盘空间,就有可能是已删除的文件的句柄没有释放,还占着空间 检查命令: lsof | grep deleted 如果发现很多del...

果树啊
18分钟前
1
0
mysql5.7 [Err] 1118 - Row size too large (> 8126).

mysql [Err] 1118 - Row size too large (> 8126). 问题 mysql5.7 在执行创建表或者增加字段时,发现row size长度过长,导致出现以下错误。 [Err] 1118 - Row size too large (> 8126). C......

GritTan
19分钟前
0
0
[mybatis]一级缓存与二级缓存配置(mybatis3.4.0)

二级缓存 添加<cache />即可 日志: 2019-05-20 16:28:16.525 [http-nio-8830-exec-2] DEBUG com.asiainfo.mysql.MysqlMapper -Cache Hit Ratio [com.asiainfo.mysql.MysqlMapper]: 0.......

Danni3
29分钟前
1
0
Kafka两级调度实现分布式协调任务分配Golang版

背景 基于Kafka消息队列的两级协调调度架构 Kafka内部为了协调内部的consumer和kafka connector的工作实现了一个复制协议, 主要工作分为两个步骤: 通过worker(consumer或connect)获取自身的...

8小时
36分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部