CursorAdapter的使用

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

主页:

实现上诉需求步骤如下;

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);
	}
}


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

源码下载










  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
是的,你可以使用 SQLite 数据库来存储用户输入的课程信息。以下是一个简单的 Java 代码示例,它使用 SQLiteOpenHelper 类来创建和管理数据库: ```java public class CourseDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "course.db"; private static final int DATABASE_VERSION = 1; public CourseDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE courses (_id INTEGER PRIMARY KEY AUTOINCREMENT, " + "course_name TEXT, course_day_of_week INTEGER, " + "course_start_time INTEGER, course_end_time INTEGER);"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Implement database upgrade logic here } } ``` 在这个示例中,我们创建了一个名为“courses”的表,其中包括课程名称、星期几、开始时间和结束时间等字段。 接着,我们可以使用 CursorAdapter 来将数据库中的数据显示在课程表中。以下是一个简单的代码示例,它使用 SimpleCursorAdapter 类来实现: ```java public class CourseListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> { private static final int LOADER_ID = 0; private CourseDatabaseHelper mDbHelper; private SimpleCursorAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mDbHelper = new CourseDatabaseHelper(getActivity()); mAdapter = new SimpleCursorAdapter(getActivity(), R.layout.list_item_course, null, new String[] { "course_name", "course_day_of_week", "course_start_time", "course_end_time" }, new int[] { R.id.course_name, R.id.course_day_of_week, R.id.course_start_time, R.id.course_end_time }, 0); setListAdapter(mAdapter); getLoaderManager().initLoader(LOADER_ID, null, this); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return new CursorLoader(getActivity(), CourseProvider.CONTENT_URI, null, null, null, null); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { mAdapter.swapCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { mAdapter.swapCursor(null); } } ``` 在这个示例中,我们创建了一个名为“CourseListFragment”的 Fragment,它使用 SimpleCursorAdapter 来将数据库中的数据显示在 ListView 中。我们使用 LoaderManager 来异步加载数据,并在数据加载完成后更新 ListView。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值