Apidemos-->Views-Lists-Cursor(people)学?

Apidemos-->Views-Lists-Cursor(people)-主要用到了获取手机联系人信息,属于内容提供者的范畴,要想了解这方面的内容,能够參考官方docs

/sdk/docs/guide/topics/providers/content-provider-basics.html

这里简单说下contentprovider;

contentprovider可实现不同应用程序之间的数据共享. 它是程序之间进行数据交换的api.

当一个程序须要把自己的数据暴露给其它程序使用时,该应用程序就能够通过提供contentprovider来实现,其它应用程序也能够通过来contentResolver操作contentprovider暴露的数据.

实例中用到了系统提供的联系人contentprovider:

经常使用的几个Uri有:

ContactsContract.Contacts.CONTENT_URL   //管理联系人的URI

ContactsContract.Contacts._ID//联系人Id

ContactsContract.Contacts.DISPLAY_NAME //联系人name 的Uri

ContactsContract.CommonDataKinds.Phone.CONTENT_URI 管理联系的电话的URI

ContactsContract.CommonDataKinds.Email.CONTENT_URI 管理联系人的E-mail的URI

随便写下自己犯了一个超级低级的错误就是.

竟然採用for来遍历cursor,把 moveToNext丢了.  还有使用完关闭游标,加上mCursor.close();

package com.example.testmyviewslistscursorpeople;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.content.Context;
import android.database.Cursor;
import android.net.LocalSocketAddress.Namespace;
import android.os.Bundle;
import android.provider.ContactsContract.Contacts;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.text.GetChars;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import com.example.testmyviewslistsactivateitems.R;

/**
 *
 * @author Administrator 仿效果slow loading apiDemos -- Views -Lists - Slow Adapter
 */
public class Main extends ListActivity {

	private boolean mBusy = false;
	public static List<String> mStrings = new ArrayList<String>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		getPeople();
		setListAdapter(new SlowAdapter(this));
		// 设置选择模式为单选
		getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
		// 首次载入设置选中items
		getListView().setItemChecked(0, true);
		getListView().setOnScrollListener(new OnScrollListener());

	}

	protected class OnScrollListener implements ListView.OnScrollListener {

		@Override
		public void onScrollStateChanged(AbsListView view, int scrollState) {
			switch (scrollState) {
			// The view is not scrolling.
			case OnScrollListener.SCROLL_STATE_IDLE:
				mBusy = false;
				int first = view.getFirstVisiblePosition();
				int count = view.getChildCount();
				for (int i = 0; i < count; i++) {
					TextView t = (TextView) view.getChildAt(i);
					if (t.getTag() != null) {
						t.setText(mStrings.get(first + i));
						t.setTag(null);
					}
				}
				break;
			// The user is scrolling using touch, and their finger is still on
			// the screen
			case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
				mBusy = true;
				break;
			// The user had previously been scrolling using touch and had
			// performed a fling.
			// The animation is now coasting to a stop
			case OnScrollListener.SCROLL_STATE_FLING:
				mBusy = true;
				break;
			}
		}

		@Override
		public void onScroll(AbsListView view, int firstVisibleItem,
				int visibleItemCount, int totalItemCount) {
		}

	}

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		getListView().setItemChecked(position, true);
	}

	// 自己定义适配器
	private class SlowAdapter extends BaseAdapter {
		private LayoutInflater mInflater;

		public SlowAdapter(Context context) {
			mInflater = (LayoutInflater) context
					.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		}

		@Override
		public int getCount() {
			return mStrings.size();
		}

		@Override
		public Object getItem(int position) {
			return position;
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			TextView text;

			if (convertView == null) {
				text = (TextView) mInflater.inflate(R.layout.main, null, false);
			} else {
				text = (TextView) convertView;
			}

			if (!mBusy) {
				text.setText(mStrings.get(position).toString());
				text.setTag(null);
			} else {
				text.setText("Loading...");
				text.setTag(this);
			}
			return text;
		}

	}

	protected  void  getPeople() {
		final String[] CONTACT_PROJECTION = new String[] { Contacts._ID,
				Contacts.DISPLAY_NAME, };
		Cursor mCursor = getContentResolver().query(Contacts.CONTENT_URI,
				CONTACT_PROJECTION, null, null, null);
		 while(mCursor.moveToNext()) {
		   String name =
		   mCursor.getString(mCursor.getColumnIndex(Contacts.DISPLAY_NAME));
		   mStrings.add(name);
		 }
                mCursor.close();
	}
}

实例源代码

添加?获取手机联系人电话的方法(仅仅为了解获取方法,尚未和联系人一一相应,兴许将改进):

	protected void getPeople() {
		final String[] CONTACT_PROJECTION = new String[] { Contacts._ID,
				Contacts.DISPLAY_NAME };
		//联系人
		Cursor mCursor = getContentResolver().query(Contacts.CONTENT_URI,
				CONTACT_PROJECTION, null, null, null);
		//联系人电话
		Cursor phones = getContentResolver().query(
				ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
				ContactsContract.CommonDataKinds.Phone.CONTACT_ID, null, null);
		while (mCursor.moveToNext()) {
			// 获取联系人
			String name = mCursor.getString(mCursor
					.getColumnIndex(Contacts.DISPLAY_NAME));
			mStrings.add(name);
			if (phones.moveToNext()) {
				//获取电话
				String phone = phones.getString(phones
						.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
				mStrings.add(phone);
			}

		}
		//关闭资源
		mCursor.close();
		phones.close();
	}

时间: 2024-10-29 01:10:58

Apidemos--&gt;Views-Lists-Cursor(people)学?的相关文章

apidemos -&gt;views/lists/Activate items 学习

看apidemos的 activate items 很简单,就是继承ListActivity, 然后给使用了 api 11中一个系统样式的textView. 然而在 API level 11 之前运行会报错.如果在11之前实现 Activateitems给出的效果,那必然要给textView 的background属性设置一个press等状态的xml来,drawable其选中的背景. 然而apidemos 给出的很简单的实现: android:background="?android:attr/

Apidemos--&gt;Views-Lists-Cursor(people)学习

Apidemos-->Views-Lists-Cursor(people)-主要用到了获取手机联系人信息,属于内容提供者的范畴,要想了解这方面的内容,可以参考官方docs /sdk/docs/guide/topics/providers/content-provider-basics.html 这里简单说下contentprovider; contentprovider可实现不同应用程序之间的数据共享. 它是程序之间进行数据交换的api. 当一个程序需要把自己的数据暴露给其他程序使用时,该应用程

ApiDemos--&gt;Views-lists-slow adapter学习

今天来按照apidemos提供的方法来实现slow loading的效果. 简单说下实现方法: 实现ListView.OnScrollListener ,监听到手势滑动的情况,当处于滚动状态时,将新显示的items 设置为Loading , 当离开屏幕时,才加载真实的数据. 设置数据时,要用到getFirstVisiblePosition属性来计算应该加载第几个item. 该小demo应该算是学习Android AsyncTask异步加载的基础. Main.java import android

HIVE 原理

Overview HiveQL DDL statements are documented here, including: CREATE DATABASE/SCHEMA, TABLE, VIEW, FUNCTION, INDEX DROP DATABASE/SCHEMA, TABLE, VIEW, INDEX TRUNCATE TABLE ALTER DATABASE/SCHEMA, TABLE, VIEW MSCK REPAIR TABLE (or ALTER TABLE RECOVER P

ApiDemos--&amp;gt;Views-lists-slow adapter学习

今天来依照apidemos提供的方法来实现slow loading的效果. 简单说下实现方法: 实现ListView.OnScrollListener ,监听到手势滑动的情况,当处于滚动状态时,将新显示的items 设置为Loading , 当离开屏幕时,才载入真实的数据. 设置数据时,要用到getFirstVisiblePosition属性来计算应该载入第几个item. 该小demo应该算是学习Android AsyncTask异步载入的基础. Main.java import android

Django web 基础

Django大而全; 创建Django工程:django-admin startproject sitename Project Project settings url wsgi web model views test admin administrator D:\python_scripts\s11day17_Django>python manage.py startapp app01  #创建app:一个app是一个完整的软件或者功能: app下面的文件: models:对数据库操作的:

Django运维后台的搭建之五:引入databases和django-crispy-forms

在上一篇,我们已经把我们做的运维外面套上了bootstrap框架,但是那仅仅是一个外壳,这一次是要把里面的壤也扣上这样的框架. 首先,编辑index.html,添加block元素,用于主页存放不同的内容: <div class="page-content">      <div class="page-content-area">                       <div class="page-header&qu

Python之路【第十六篇续】Django进阶篇

Django请求生命周期 首先:对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端 路由系统 在Django的urls中我们可以根据一个URL对应一个函数名来定义路由规则如下: from cmdb import views urlpatterns = [ url(r'^login/$', views.login), url(r'^index/$', views.index), url(r'^lists/$', views.lists), url(r'^add/$'

路由系统和中间件系统

路由系统 在Django的urls中我们可以根据一个URL对应一个函数名来定义路由规则如下: 这里需要注意下:当客户访问过来请求的时候,到达路由系统后是根据正则来匹配的,如果上面的匹配成功了,  后面的路由规则将不会继续匹配,需要注意!!!!所以我们在后面都加一个$来做结尾 1.基本的URL对应. urls中我们可以根据一个URL对应一个函数名来定义路由规则如下: from cmdb import views urlpatterns = [ url(r'^login/$', views.logi