需求: 主页为一个EditText和Button,点击Button跳转到联系人列表,联系人列表为一个ListView,点击条目,回到主页,并在EditText上展示联系人号码.主页:
![](https://img-blog.csdn.net/20170119133200943)
实现上诉需求步骤如下;
1 首先创建项目,主页的布局以及代码如下
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button mBt_num;
public static final int REQ_CODE_SELECT_NUM=100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initEvent();
}
//初始化事件
private void initEvent() {
mBt_num.setOnClickListener(this);
}
//初始化控件
private void initView() {
mBt_num= (Button) findViewById(R.id.bt_num);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.bt_num:
Intent intent =new Intent(this,SelectNumActivity.class);
startActivityForResult(intent, REQ_CODE_SELECT_NUM);
break;
}
}
}
XML布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
tools:context="com.arvin.cursoradapterdemo.MainActivity">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="联系人号码"
/>
<Button
android:id="@+id/bt_num"
android:gravity="center"
android:padding="10dp"
android:text="选择联系人号码"
android:textSize="18sp"
android:textColor="#fff"
android:background="@color/colorPrimary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
2 上面代码完成后,当我们点击Button时,跳转到联系人界面.逻辑如下;
CursorAdapter依赖Cursor对象,所以需要准备Cursor,
adapter需要的条件:
ListView --> adapter --> LIst<Bean> --> item--> item.XML
- CursorAdapter使用的场景:
- 仅使用数据库存储的数据
- 数据量比较大
- CursorAdapter的特点:
- 不依赖list集合,而是依赖游标cursor
- 可以做到边读取边查询,一般只读取一个页面的数据,占用非常小的内存
- CursorAdapter的使用
- 构造函数中必须传入查询要用到的Cursor
- 必须实现两个方法
- newView(),该方法和使用BaseAdapter一样,主要是用来构造Item视图
- bindView(),绑定数据时使用
- CursorAdapter使用的注意事项:
- CursorAdapter的查询必须带有主键,即_ID列()
- 在bindView方法中的游标cursor不需要移动,方法提供的cursor已经移动到条目对应的位置
- 方法中的cursor不需要close
- 如果要实现条目的点击事件,需要先调用cursor.moveToPosition(position)方法,此时cursor将移动到对应的条目,之后即可获取数据
-
更改Cursor查询的排序
- 正序和倒序 " asc" : " desc"
- 之后调用adapter.changeCursor(cursor)方法
-
代码
public class ContactsDAO {
//获取所有联系人的Cursor
public static Cursor getAllCursor(Context context) {
ContentResolver contentResolver = context.getContentResolver();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection = new String[]{
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
ContactsContract.CommonDataKinds.Phone._ID};//返回的列名
String selection = null; //查询的条件
String[] selectionArgs = null;//查询条件的参数
String sortOrder = null; //排序
Cursor cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);
return cursor;
}
//获取联系人姓名 电话
public static ArrayList<NumBean> getAllContacts(Context context) {
ArrayList<NumBean> datas = new ArrayList<>();
ContentResolver cr = context.getContentResolver();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection = new String[]{
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
};
String selection = null; //查询的条件
String[] selectionArgs = null;//查询条件的参数
String sortOrder = null; //排序
Cursor cursor = cr.query(uri, projection, selection, selectionArgs, sortOrder, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String name = cursor.getString(0);
String number = cursor.getString(1);
String id = cursor.getString(2);
NumBean bean = new NumBean();
bean.Name = name;
bean.Number = number;
bean.iconId = id;
datas.add(bean);
}
cursor.close();
}
return datas;
/**uri 查询的uri
* projection 返回的列名
* selection 查询的条件
* selectionArgs 查询条件的参数
* sortOrder 排序*/
}
public static NumBean getNumBean(Cursor cursor) {
String name = cursor.getString(0);
String num = cursor.getString(1);
String id = cursor.getString(2);
NumBean bean = new NumBean();
bean.Name = name;
bean.Number = num;
bean.iconId = id;
return bean;
}
//获取联系人头像的bitmap content://com.android.contacts
public static Bitmap getBitmap(Context context, String id){
ContentResolver cr=context.getContentResolver();
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI,id);
InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(cr, uri);
return BitmapFactory.decodeStream(is);
}
}