CursorAdapter的使用

需求: 主页为一个EditTextButton,点击Button跳转到联系人列表,联系人列表为一个ListView,点击条目,回到主页,并在EditText上展示联系人号码.

主页:

CursorAdapter的使用_第1张图片

实现上诉需求步骤如下;

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布局如下:




    
    

2 上面代码完成后,当我们点击Button时,跳转到联系人界面.逻辑如下;

CursorAdapter依赖Cursor对象,所以需要准备Cursor,

adapter需要的条件:

ListView --> adapter --> LIst --> item-->  item.XML

 CursorAdapter的使用_第2张图片

  • 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 getAllContacts(Context context) {
		ArrayList 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);
	}
}


最后别忘了,添加读取权限.

源码下载










你可能感兴趣的:(Android)