آموزشی برای فهمیدن لیست ویو (ListView)
قسمت اول
ما در این جا میخواهیم لیست ویو رو دوباره یک نگاهی بیندازیم
در توسعه اندروید، ما هر وقت بخواهیم یک لیست عمودی از ایتم ها رو نشان بدیم از لیست ویو استفاده می کنیم که برای ارتباط به منبع داده ما باید از یک آداپتور (Adaptor) استفاده کنیم. وقتی که ما می خواهیم داده ها را برای لیست مون به طور مستقیم از یک SQLite database query بگیریم، آن وقت ما میتونیم از CursorAdapter استفاده کنیم.

CursorAdapter بین یک Cursor (منبع داده های از SQLite query) و لیست ویو ( ارائه دیداری ) مجهز شده و از دو وجه پیکر بندی می شود:
1- اینکه قالب layout به inflate برای یک آیتم
2-اینکه فیلد های cursor متصل شوند به ویوهای در قالب
استفاده از CursorAdapter سفارشی:
تعریف جداول:
نخست ما نیاز داریم که یک جدول رو تعریف کنیم در database که از آن ما cursor مان را بار می زنیم (load). در این مورد ما یک جدول پایگاه داده تعریف خواهیم کرد به اسم todo_items برای یک مجموعه ای از آیتم های TODO با بدنه(body) string و یک integer priority.
| body | priority |
|---|
| body | priority |
|---|---|
| Get milk | 2 |
| Do laundry | 3 |
برای ایجاد یک جدول دیتابیس ما از SQLite persistence و یا یک ORM که اجازه بدهند به ما تا تعریف کنیم آبجکت های نقشه مان را برای تعریف جداول استفاده می کنیم.
ایجاد قالب ویو (View) :
وقتی که ما می خواهیم نمایش بدهیم یک سری از آیتم های داخل یک لیست رو استفاده می کنیم از نمایش های سفارشی از لیست ها، ما نیاز داریم برای هر مورد استفاده کنیم از قالب سفارشی لای اوت(layout) XML.
ما می توانیم به سادگی ایجاد کنیم یک قالب لای اوت XML در res/layout/item_todo.xml به نمایندگی یک ردیف cursor خاص
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/tvBody" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Study cursors" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/tvPriority" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:text="3" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout>
با عرض پوزش به دلیل ذیق وقت در قسمت بعدی ادامه آموزش رو می آوریم
قسمت دوم
تعریف یک آداپتور
قدم بعدی، ما نیاز به تعریف آداپتور برای توصیف فرایند تبدیل Cursor داخل یک ویو (View) داریم . برای انجام این ما نیاز به override کردن متد newView و متد bindView داریم. راه ساده برای این (بدون هر ویو ذخیره شده ای) ادامه آموزش رو نگاه کنید:
public class TodoCursorAdapter extends CursorAdapter { public TodoCursorAdapter(Context context, Cursor cursor, int flags) { super(context, cursor, 0); } // The newView method is used to inflate a new view and return it, // you don't bind any data to the view at this point. @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { return LayoutInflater.from(context).inflate(R.layout.item_todo, parent, false); } // The bindView method is used to bind all data to a given view // such as setting the text on a TextView. @Override public void bindView(View view, Context context, Cursor cursor) { // Find fields to populate in inflated template TextView tvBody = (TextView) view.findViewById(R.id.tvBody); TextView tvPriority = (TextView) view.findViewById(R.id.tvPriority); // Extract properties from cursor String body = cursor.getString(cursor.getColumnIndexOrThrow("body")); int priority = cursor.getInt(cursor.getColumnIndexOrThrow("priority")); // Populate fields with extracted properties tvBody.setText(body); tvPriority.setText(String.valueOf(priority)); } }
نخست، ما تعریف می کنیم سازنده ای را (constructor) که عبور کند از cursor و context به superclass. بعد، ما override می کنیم متد newView را که در inflate استفاده شده برای قالب ویو جدید. در نهایت، ما override می کنیم bindView را که استفاده شده برای همه داده ها را بگیرد و به ویو بدهد تا محتوی قالب را برای آیتم جایگذاری کند.
باز یافتن Cursor
به منظور استفاده از CursoAdaptor ، ما نیاز به query یک پایگاه داده SQLite داریم و برگرداند یک Cursor را به نمایندگی نتیجه ست شده. این مستلزم این است که ما از یک SQLiteOpenHelper برای persistence یا یک ORM که آماده کردیم در دیتابیسمون.
هنگامی که شما یک دیتابیس و جداول تعریف شده دارید، پس ما می توانیم دسترسی داشته باشیم به یک Cursor توسط پرس وجو (query) از دیتابیس با دستور rawQuery.
// TodoDatabaseHandler is a SQLiteOpenHelper class connecting to SQLite TodoDatabaseHandler handler = new TodoDatabaseHandler(this); // Get access to the underlying writeable database SQLiteDatabase db = handler.getWritableDatabase(); // Query for items from the database and get a cursor back Cursor todoCursor = db.rawQuery("SELECT * FROM todo_items", null);
اتصال آداپتور به یک لیست ویو
حالا، ما می توانیم از CursorAdapter در Activity استفاده کنیم برای نمایش آرایشی از آیتم ها در داخل لیست ویو:
// Find ListView to populate ListView lvItems = (ListView) findViewById(R.id.lvItems); // Setup cursor adapter using cursor from last step TodoCursorAdapter todoAdapter = new TodoCursorAdapter(this, todoCursor); // Attach cursor adapter to the ListView lvItems.setAdapter(todoAdapter);
از این سپس CursorAdapter تکرار می شود از طریق ست کردن تنظیم و لیست را جایگزین می کند یا در واقع پر می کند از مقادیر. ما می توانیم تغییر بدیم cursor رو توسط به روزرسانی آداپتور هر لحظه که بخواهیم با دستور:
// Switch to new cursor and update contents of ListView todoAdapter.changeCursor(newCursor);
منبع آموزش :
http://www.gustekdev.com/2013/05/custom-cursoradapter-and-why-not-use.html
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .