آموزش کار با ریسایکلر ویو در اندروید استودیو.

آموزش حرفه‌ای کار با ریسایکلر ویو  در برنامه اندروید استودیو

ریسایکلر ویو  ورژن جدید و پیشرفته ی listview ست که با توجه به پیشرفته تر بودن کارایی بالاتری دارد. این ویجت می تواند به نسبت ورژن قبلی خودش listview داده ها و اطلاعات بیشتری را با چند view محدود به شکل کاربردی به ما نمایش دهد. ازجمله قابلیت ها این دو ورژن یعنی Recyclerview یا viewgroup نسبت به listview یا grideview این است که:
مدیریت و تسلط بر ورژن جدید راحتتر است
سرعت بارگیری و لود شدن آن به نسبت افزایش داشته است
از قابلیت های جذاب در Recyclerview این است که این امکان را به برنامه نویس می دهد که برای اضافه و یا حذف شدن آیتم ها از انیمیشن استفاده کند.
در Recyclerview همه ی آیتم هایی که در لیست هستند قابل مشاهده نیست و فقط ما آیتم هایی را می بینیم که در صفحه نمایش قرار گرفته اند.
Recyclerview می تواند لایه های متنوعی را از جمله LinearlayoutManager و gridlayoutManager انجام بدهد.
از مزیت این ویجت این است که مقدار رم کمتری را از گوشی کاربر اشغال می کند.
در Recyclerview می توان دیتابیس را مشاهده کرد که این دیتابیس می تواند آنلاین یا آفلاین باشد.
در ویجت Recyclerview این امکان را برای برنامه نویس فراهم می کند که آیتم ها را به صورت افقی horizontal و عمودی نمایش بدهد.
Recyclerview می تواند لیستی از view ها را به نمایش بگذارد که قابلیت scroll داشته و محدود نیست. مثل لیستی از مخاطبین و یا لیست inbox در نرم افزار email و…
برای نمایش لیست در Recyclerview ابتدا باید به طراحی یک قالب کلی برای نمایش بپردازیم. بعد از طراحی، اطلاعاتی را می خواهیم در قالب لیست نمایش داده شود به قالب از قبل طراحی شده می فرستیم تا همه به صورت فرمتی واحد باشند.
نکته: داشتن اطلاعاتی در مورد listview می تواند مارا به فهمی بهتر از Recyclerview برساند.
در اندروید استودیو یک پروژه جدید با نام RecyclerView و یک Empty Activity ایجاد می کنیم. برای استفاده از RecyclerView باید کتابخانه آنرا به پروژه اضافه کنیم که از کتابخانه های متعلق به support است. کتابخانه را به دو صورت اضافه کردن دستی به فایل build.gradle و یا مسیر:

File > Project Structure > Modules (app) > Dependencies > + > Library Dependency
به پروژه اضافه می کنیم:

dependencies { implementation fileTree(include: [‘*.jar’], dir: ‘libs’) implementation ‘com.android.support:appcompat-v7:27.0.2’ implementation ‘com.android.support:recyclerview-

v7:27.0.2’ } پس از سینک شدن موفق پروژه، یک ویجت/کامپوننت از نوع RecyclerView در لایه اکتیویتی اصلی پروژه یعنی activity_main.xml تعریف می کنیم:سپس RecyclerView را به فایل جاوا اکتیویتی اضافه می کنیم:

MainActivity.java:

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.RecyclerViewpublic class MainActivity extends AppCompatActivity<p dir=”ltr”>RecyclerView myRecycler;</p>@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);</p>myRecycler = findViewById(R.id.recycler_viewmyRecycler = (RecyclerView) findViewById(R.id.recycler_view);

مانند مبحث ListView برای مدیریت ویجت / view ها و ارتباط آنها با عملگرهای جاوا، از کلاسی استفاده می کنیم که Model نامیده می شود. استفاده از چنین کلاسی لازم نیست اما باعث می شود مدیریت بهتری روی پروژه داشته باشیم. در کلاس Model از متدهایی که اصطلاحا Getter و Setter نامیده می شوند برای مقداردهی به متغیرها و یا مقدارگیری از آنها استفاده می شود.
برای ساخت Model، یک کلاس با نام دلخواه Item به پکیج اصلی پروژه اضافه می کنیم.

package ir.android_studio.recyclerview><p dir=”ltr”>public class Item {</p><p dir=”ltr”>private int uAvatar;private String uName;private String uMessage;private String uTime>

می خواهیم هر یک از آیتم های RecyclerView حاوی یک تصویر پروفایل، نام، متن پیغام و تاریخ ارسال باشد.
چهار متغیر در کلاس تعریف کردم که یکی برای نمایش تصویر شخص و سه مورد دیگر برای نمایش نام، متن پیغام و تاریخ استفاده خواهد شد. در ادامه متدهای سازنده (Constructor) و همچنین Getter & Setter را به کلاس مدل اضافه می کنیم:

package ir.android_studio.recyclerview><p dir=”ltr”>public class Item {</p><p dir=”ltr”>private int uAvatar;private String uName;private String uMessage;private String uTime;</p><p dir=”ltr”>public Item(int uAvatar, String uName, String uMessage, String uTime) {this.uAvatar = uAvatar;this.uName = uName;this.uMessage = uMessage;this.uTime = uTime;}</p><p dir=”ltr”>public int getuAvatar() {return uAvatar;}</p><p dir=”ltr”>public void setuAvatar(int uAvatar) {this.uAvatar = uAvatar;}</p><p dir=”ltr”>public String getuName() {return uName;}</p><p dir=”ltr”>public void setuName(String uName) {this.uName = uName;}</p><p dir=”ltr”>public String getuMessage() {return uMessage;}</p><p dir=”ltr”>public void setuMessage(String uMessage) {this.uMessage = uMessage;}</p><p dir=”ltr”>public String getuTime() {return uTime;}</p><p dir=”ltr”>public void setuTime(String uTime) {this.uTime = uTime;

در ابتدای مبحث گفتیم برای نمایش آیتم های لیست از یک قالب مشترک استفاده می شود که هر آیتم با همان فرمت و چینش طراحی به RecyclerView فرستاده می شود. من همان قالبی که در مبحث ListView (لیست سفارشی) طراحی کرده بودم را در این پروژه استفاده می کنم. یک فایل با نام list_item به دایرکتوری layout پروژه اضافه می کنیم.

<?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=”100dp”android:padding=”5dp”android:orientation=”horizontal”></p><p dir=”ltr”><ImageViewandroid:id=”@+id/img_avatar”android:layout_width=”0dp”android:layout_height=”match_parent”android:layout_weight=”0.2″android:src=”@drawable/avatar_1″ /></p><p dir=”ltr”><LinearLayoutandroid:layout_width=”0dp”android:layout_height=”match_parent”android:layout_weight=”0.8″android:orientation=”vertical”></p><p dir=”ltr”><LinearLayoutandroid:layout_width=”match_parent”android:layout_height=”0dp”android:layout_weight=”0.5″android:orientation=”horizontal”></p><p dir=”ltr”><TextViewandroid:id=”@+id/txt_name”android:layout_width=”0dp”android:layout_height=”match_parent”android:layout_weight=”1″android:gravity=”bottom”android:paddingLeft=”5dp”android:text=”Name” /></p><p dir=”ltr”><TextViewandroid:id=”@+id/txt_time”android:layout_width=”0dp”android:layout_height=”match_parent”android:layout_weight=”1″android:gravity=”bottom|right”android:text=”Time” /></LinearLayout></p><p dir=”ltr”><TextViewandroid:id=”@+id/txt_message”android:layout_width=”match_parent”android:layout_height=”0dp”android:layout_marginTop=”5dp”android:layout_weight=”0.5″android:paddingLeft=”5dp”android:text=”Message”android:textColor=”#161111″ /></p>LinearLayout> </LinearLayout>

این لایه شامل یک ImageView و سه TextView است. یک تصویر هم در دایرکتوری drawable برای نمایش مکان آواتار در قسمت Preview اندروید استودیو قرار دادیم.
در مرحله بعد برای مدیریت view ها و ارسال داده های دریافتی (شامل آدرس تصویر پروفایل، نام، متن پیغام و تاریخ) به آنها، نیاز به ساخت یک کلاس Adapter داریم. بنابراین یک کلاس دیگر با نام دلخواه ItemAdapter به پکیج اصلی پروژه اضافه می کنیم.
ما در ListView برای بهینه تر شدن برنامه، یک ViewHolder تعریف می کنیم. در RecyclerView هم این مورد درون کتابخانه تعبیه شده و برای تعریف view ها باید از ViewHolder استفاده کنیم. داخل کلاس آداپتر قبل از هرکار ابتدا یک کلاس داخلی (inner class) برای ViewHolder ایجاد و آنرا تکمیل می کنیم:

package ir.android_studio.recyclerview>import android.support.v7.widget.RecyclerView;<>public class ItemAdapter<=>public class MyViewHolder extends RecyclerView.ViewHolder>

یک کلاس داخلی با نام دلخواه MyViewHolder به کلاس ItemAdapter اضافه کردیم. این کلاس باید از کلاس ViewHolder ارث بری شود و با توجه به اینکه ViewHolder در کتابخانه RecyclerView تعریف شده، کلاس را باید از RecyclerView.ViewHolder ارث بری کنیم.
View ها را داخل MyViewHolder تعریف می کنیم:

public class MyViewHolder extends RecyclerView.ViewHolder ><p dir=”ltr”>public ImageView aAvatar;public TextView aName;public TextView aMessage;<public TextView aTime;<

در بدنه کلاس MyViewHolder خطایی مشاهده می شود که با قراردادن نشانگر روی آن و زدن alt+Enter از ما می خواهد متد سازنده را به کلاس اضافه کنیم:

public class MyViewHolder extends RecyclerView.ViewHolder<p dir=”ltr”>public ImageView aAvatar;public TextView aName;public TextView aMessage;public TextView aTime;</p><=””>public MyViewHolder(View itemView{super(itemView);}

حالا view ها را درون متد سازنده به متغیر مربوط به خودشان متصل می کنیم:

public class MyViewHolder extends RecyclerView.ViewHolder<=””>public ImageView aAvatar;public TextView aName;public TextView aMessage;public TextView aTime;</p><=””>public MyViewHolder(View itemView) {super(itemView);</p><p dir=”ltr”>aAvatar = itemView.findViewById(R.id.img_avatar);aName = itemView.findViewById(R.id.txt_name);aMessage = itemView.findViewById(R.id.txt_message);aTime = itemView.findViewById(R.id.txt_time);}}

ملاحظه می کنید در اینجا قبل از findViewById به واسطه itemView که از جنس View است تعریف شده و به تنهایی نمی توان استفاده کرد. در واقع itemView شامل هریک از آیتم های RecyclerView می باشد. فعلا با MyViewHolder کاری نداریم.
پس از ساخت ViewHolder، لازم است کلاس ItemAdapter از RecyclerView.Adapter ارث بری شود.
اگر طبق مراحل پیش رفته باشید مشاهده می کنید در لیست پیشنهادی، در مقابل Adapter عبارت VH (مخفف ViewHolder) قید شده به این معنی که در اینجا باید کلاسی که از ViewHolder اصطلاحا کاستوم کردیم را وارد کنیم:
در نهایت کلاس به اینصورت تکمیل می شود:

package ir.android_studio.recyclerview;><=””>import android.support.v7.widget.RecyclerView;import android.view.View;import android.widget.ImageView;import android.widget.TextView;</><=””>public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.MyViewHolder> {</><=””>public class MyViewHolder extends RecyclerView.ViewHolder {</><=””>public ImageView aAvatar;public TextView aName;public TextView aMessage;public TextView aTime;</p><=””>public MyViewHolder(View itemView) {super(itemView);</p><=””>aAvatar = itemView.findViewById(R.id.img_avatar);aName = itemView.findViewById(R.id.txt_name);aMessage = itemView.findViewById(R.id.txt_message);aTime = itemView.findViewById(R.id.txt_time);}}</><

مجدد در بدنه کلاس اصلی هم خطا میگیرم که با alt+Enter متدهای ضروری Adapter را اضافه می کنیم:

[] package ir.android_studio.recyclerview>import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;</p>public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.MyViewHolder;@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {return null;@Overridepublic void onBindViewHolder(MyViewHolder holder, int position) {</p>@Overridepublic int getItemCount() {return 0;;public class MyViewHolder extends RecyclerView.ViewHolder {<p dir=”ltr”>public ImageView aAvatar;public TextView aName;public TextView aMessage;public TextView aTime;</p>;public MyViewHolder(View itemView) {super(itemView);;aAvatar = itemView.findViewById(R.id.img_avatar);aName = itemView.findViewById(R.id.txt_name);aMessage = itemView.findViewById(R.id.txt_message);aTime = itemView.findViewById(R.id.txt_time);}}کدنویسان جوان

 

مطلب مفیدی برای شما بود ؟ پس به اشتراک بگذارید برای دوستانتان

codesrcReza

109 مطلب منتشر شده

درباره این مطلب نظر دهید !