آموزش recycler view در اندروید استودیو

در این آموزش قصد داریم به یادگیری recycler review می پردازیم قبل از اینکه به بررسی و آموزش ریسایکلر ویو در اندروید استودیو بپردازیم باید ببینیم که Recycler view چیست و برای چه کاری استفاده می شود.اصلا Recycler view چیست؟در اندروید استودیو های قدیمی ما گزینه ای به نام listview و gridview داشتیم که در نسخه 5 اندروید به بعد Recycler view که در حقیقت نسخه منعطف تر و بهتری از آن است معرفی شده است. در حقیقت در Recycler view برخلاف list view که یک مولفه برای شما کار میکرد. چندین مولفه برای شما کار میکنند. در Recycler view بر خلاف list view که تعداد محدودی از گزینه ها را داشتیم هیچ محدودیتی در تعداد گزینه های لیست خود نداریم و میتوانیم به سادگی تعداد بسیار زیادی از آیتم ها را درون آن قرار دهیم همچنین همگام استفاده از Recycler view می توانیم از اینیمیشن ها استفاده کنیم که زیبایی بیشتری به کار نهایی ما میدهد. این قابلیت ها باعث می شود Recycler view طراحی کاربر پسندانه تری به نرم افزار شما بدهد.اجزای Recycler viewبرای شروع به کار با Recycler view ما نیاز به دانستن موارد زیر داریم. ویژگی RecyclerView.Adapter: در حقیقت این آداپتور برای handle داده های مورد نظر اتصال آن ها به ویو استفاده می شود. ویژگی LayoutManager: که به قرار دهی آیتم ها در مکان درست کمک میکند. ویژگی Itemanimator: به ساخت انیمیشن های ما کمک میکند.معرفی RecyclerView.Adapterآداپتور Recycler view درحقیقت شامل یک شکل جدید از آداپتور است. روش کار آن بسیار مشابه با آداپتور هایی است که تا کنون استفاده میکردید اما نیاز به برخی ویژگی ها مانند viewholder دارد.معرفی LayoutManagersریسایکلرویو برای نمونه سازی در حقیقت به یک layout manager و یک آداپتور نیاز دارد در حقیقت یک layout manager آیتم ها را درون Recycler view قرار میدهد و مشخص میکند که چه آیتم هایی در دید کاربر هستند و چه آیتم هایی خارج از دید کاربر هستند و دیگر در صفحه قابل مشاهده نیستند. در Recycler view ما سه نوع layout manage داخلی داریم. این سه نوع manager عبارتند از LinearLayoutManager که نشان دهنده لیست عمودی و افقی است. GridLayoutManager که نشان دهنده آیتم ها در گرید است و StaggeredGridLayoutManager که آیتم ها را در Staggered grid نشان می دهد.لازم به ذکر است که در ورژن اخیر Support Library اگر به طور دقیق layout manager را تنظیم نکنید. ریسایکلر ویو نمایش داده نمی شود و یک ارور Logcat به شکل زیر به وجود می آید.E/RecyclerView: No layout manager attached; skipping layoutمعرفی ItemAnimatorآداپتور RecyclerView.ItemAnimator وظیفه Animate کردن تغییرات viewgorup مانند اضافه کردن و دیلیت کردن را دارد که به آداپتور اطلاع داده می شود. DefaultItemAnimator را می توان برای انیمیشن های پیش فرض استفاده کرد وبا استفاده از این انیمیشن ها بسیار خوب کار می کند.استفاده از Recycler viewبرای استفاده از Recycler view باید مراحل زیر را انجام دهیم.1. ابتدا Recycler view اندرویدx را به فایل gradle build اضافه میکنیم.2. یک کلاس مدل را تعریف میکنیم تا به عنوان منبع داده ما استفاده شود.3. یک RecyclerView را به activity خود اضافه میکنیم که آیتم ها را نمایش دهد.4. یک فایل خام XML برای نمایش و ظاهر آیتم ها میسازیم.5. یک RecyclerView.Adapter و یک ViewHolder برای رندر کردن آیتم ها میسازیم.6. آداپتور ساخته شده را به منبع داده ها متصل میکنیم.نصب recycler viewابتدا باید شروع به نصب ریسایکلر ویو کنیم. برای شروع به کار ابتدا اطمینان حاصل کنید که کتابخانه Recycler view اندروید X به عنوان یک dependency در app/build.gradle قرار داشته باشد.dependencies {...implementation 'androidx.recyclerview:recyclerview:1.1.0'}یعد از زدن کد بالا برروی Sync Project with Gradle filesکلیک کنید تا موارد مورد نیاز شما دانلود شود.تعریف مدلهر recycler view با استفاده از منبعی از داده ها پشتیبانی می شود. در این مورد ما یک کلاس contact را تعریف میکنیم که نشان دهنده مدل داده هایی است که در recycler view استفاده می شود.public class Contact {private String mName;private boolean mOnline;public Contact(String name, boolean online) {mName = name;mOnline = online;}public String getName() {return mName;}public boolean isOnline() {return mOnline;}private static int lastContactId = 0;public static ArrayList<Contact> createContactsList(int numContacts) {ArrayList<Contact> contacts = new ArrayList<Contact>();for (int i = 1; i <= numContacts; i++) {contacts.add(new Contact(&quotPerson &quot + ++lastContactId, i <= numContacts / 2));}return contacts;}}ساخت یک recycler view به همراه layoutدر درون فایل لایوت اکتیویتی XML مورد نظر در res/layout/activity_users.xml بایستی recycler view را از Support library وارد کنیم.<?xml version=&quot1.0&quot encoding=&quotutf-8&quot?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&quothttp://schemas.android.com/apk/res/android&quotxmlns:app=&quothttp://schemas.android.com/apk/res-auto&quotandroid:layout_width=&quotmatch_parent&quotandroid:layout_height=&quotmatch_parent&quot><androidx.recyclerview.widget.RecyclerViewandroid:id=&quot@+id/rvContacts&quotandroid:layout_width=&quot0dp&quotandroid:layout_height=&quot0dp&quotapp:layout_constraintBottom_toBottomOf=&quotparent&quotapp:layout_constraintEnd_toEndOf=&quotparent&quotapp:layout_constraintStart_toStartOf=&quotparent&quotapp:layout_constraintTop_toTopOf=&quotparent&quot /></androidx.constraintlayout.widget.ConstraintLayout>در layout, preview میتوانیم RecyclerView درون فعالیت خود را ببینیم.ساخت یک layout ردیفیقبل از اینکه به ساخت Adaptor بپردازیم باید یک فایل XML ایجاد کنیم. این فایل XML در حقیقت برای هر ردیف لیست ما استفاده می شود. این آیتم layout باید شامل یک ردیف افقی به همراه یک اسم و دکمه باشد.این layout میتواند از مسیر res/layout/item_contact.xml ساخته شود و هر ردیف را رندر بگیرد.<?xml version=&quot1.0&quot encoding=&quotutf-8&quot?><LinearLayoutxmlns:android=&quothttp://schemas.android.com/apk/res/android&quotandroid:orientation=&quothorizontal&quotandroid:layout_width=&quotmatch_parent&quotandroid:layout_height=&quotwrap_content&quotandroid:paddingTop=&quot10dp&quotandroid:paddingBottom=&quot10dp&quot><TextViewandroid:id=&quot@+id/contact_name&quotandroid:layout_width=&quot0dp&quotandroid:layout_height=&quotwrap_content&quotandroid:layout_weight=&quot1&quot/><Buttonandroid:id=&quot@+id/message_button&quotandroid:layout_width=&quotwrap_content&quotandroid:layout_height=&quotwrap_content&quotandroid:paddingLeft=&quot16dp&quotandroid:paddingRight=&quot16dp&quotandroid:textSize=&quot10sp&quot/></LinearLayout>حال بعد از اینکه ساخت layout خود را به پایان رساندیم میتوانیم شروع به ساخت adaptor کنیم.ساخت آداپتوردر اینجا نیاز به ساخت یک آداپتور داریم تا اطلاعات مارا درون ریسایکلر ویو نشر دهد. در حقیقت کار آداپتور تبدیل یک شی در یک مکان به لیستی ( ردیفی ) از آیتم ها برای قرار دهی اطلاعات است. لازم است این را بدانیم که آداپتور RecyclerView نیاز به وجود یک شی به نام ViewHolder دارد این View Holder در حقیقت نقش تعریف کننده و همچنین تهیه کننده دسترسی به همه view های درون یک ردیف را دارد. ما از طریق روش زیر میتوانیم به یک لیست آداپتور خالی و یک Holder در ContactsAdapter.java دسترسی پیدا کنیم.// Create the basic adapter extending from RecyclerView.Adapter// Note that we specify the custom ViewHolder which gives us access to our viewspublic class ContactsAdapter extendsRecyclerView.Adapter<ContactsAdapter.ViewHolder> {// Provide a direct reference to each of the views within a data item// Used to cache the views within the item layout for fast accesspublic class ViewHolder extends RecyclerView.ViewHolder {// Your holder should contain a member variable// for any view that will be set as you render a rowpublic TextView nameTextView;public Button messageButton;// We also create a constructor that accepts the entire item row// and does the view lookups to find each subviewpublic ViewHolder(View itemView) {// Stores the itemView in a public final member variable that can be used// to access the context from any ViewHolder instance.super(itemView);nameTextView = (TextView) itemView.findViewById(R.id.contact_name);messageButton = (Button) itemView.findViewById(R.id.message_button);}}}حال که آداپتور و view holder را تعریف کردیم میتوانیم آداپتور خود را پر کنیم. برای شروع میتوانیم یک member variable برای لیست مخاطبین خود ایجاد کرده و لیست را از طریق constructor انتقال دهیم.public class ContactsAdapter extendsRecyclerView.Adapter<ContactsAdapter.ViewHolder> {// ... view holder defined above...// Store a member variable for the contactsprivate List<Contact> mContacts;// Pass in the contact array into the constructorpublic ContactsAdapter(List<Contact> contacts) {mContacts = contacts;}}هر آداپتور دارای 3 متد اصلی است: onCreateViewHolder که آیتم مورد نظر را پر کرده و لایوت را بسازد. onBindViewHolder که وظیفه انجام تنظیمات ویژگی های نمایشی بر اساس داده ها را دارد و getItemCount که تعداد آیتم های مورد نمایش را میشمارد. برای اینکه این سه ویژگی را درون آداپتور خود بگنجانیم میتوانیم از کد زیر استفاده کنیم.public class ContactsAdapter extendsRecyclerView.Adapter<ContactsAdapter.ViewHolder> {// ... constructor and member variables// Usually involves inflating a layout from XML and returning the holder@Overridepublic ContactsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {Context context = parent.getContext();LayoutInflater inflater = LayoutInflater.from(context);// Inflate the custom layoutView contactView = inflater.inflate(R.layout.item_contact, parent, false);// Return a new holder instanceViewHolder viewHolder = new ViewHolder(contactView);return viewHolder;}// Involves populating data into the item through holder@Overridepublic void onBindViewHolder(ContactsAdapter.ViewHolder holder, int position) {// Get the data model based on positionContact contact = mContacts.get(position);// Set item views based on your views and data modelTextView textView = holder.nameTextView;textView.setText(contact.getName());Button button = holder.messageButton;button.setText(contact.isOnline() ? &quotMessage&quot : &quotOffline&quot);button.setEnabled(contact.isOnline());}// Returns the total count of items in the list@Overridepublic int getItemCount() {return mContacts.size();}}حال که آداپتور ما کامل شده است میتوانیم به ترکیب داده ها و آداپتور بپردازیم.ترکیب Adaptor و Recycler viewدر این اکتیویتی و مشغول populate تعدادی sample user که باید در recycler view نمایش داده شود می شویم.public class UserListActivity extends AppCompatActivity {ArrayList<Contact> contacts;@Overrideprotected void onCreate(Bundle savedInstanceState) {// ...super.onCreate(savedInstanceState);setContentView(R.layout.activity_users);// Lookup the recyclerview in activity layoutRecyclerView rvContacts = (RecyclerView) findViewById(R.id.rvContacts);// Initialize contactscontacts = Contact.createContactsList(20);// Create adapter passing in the sample user dataContactsAdapter adapter = new ContactsAdapter(contacts);// Attach the adapter to the recyclerview to populate itemsrvContacts.setAdapter(adapter);// Set layout manager to position the itemsrvContacts.setLayoutManager(new LinearLayoutManager(this));// That's all!}}حال در پایان مراحل بالا باید لیستی به شکل زیر ببینید و اگر لیست شما به اندازه کافی آیتم داشته باشد به سادگی میتوانید بین آیتم ها scroll کنید. این scroll کردن بسیار سریع تر و روان تر از listview انجام می پذیرد.در این آموزش دیدیم که چگونه می‌توانیم یک recycler view را در اندروید استودیو ایجاد کرده و به شکلی که میخواهیم از آن استفاده کنیم. اگر بخواهید از لیست های قابل اسکرول کردن در اپلیکیشن خود استفاده کنید بهترین راه استفاده از recycler view به جای list view است زیرا هنگامی که داده های درون لیست شما از تعدادی بیشتر می شوند حتی برای اسکرول در درون لیست هم ممکن است با استفاده از list view به مشکل بخورید.اگر شما علاقه مند به برنامه نویسی اندروید هستید و کار با اندروید استودیو برایتان لذت بخش است پیشنهاد می‌کنیم مجموعه آموزش های اندروید سایت ما را بررسی کنید.