در برنامه نویسی اندروید به علت اینکه فضای صفحه نمایش گوشی محدود هست، و تمام چیزی را که می خواهیم نمی توان درون آن جا داد، پس ما از مفهوم پر کاربرد لیست استفاده می کنیم، ولی استفاده از لیست زمانی که ما آیتم های زیادی داریم، باعث گیر کردن و کند شدن اپلیکیشن می شود، پس برای اینکه از این مشکل جلوگیری کنیم، باید از RecyclerView استفاده کنیم، در ادامه همراه ما باشید تا با recyclerview در اندروید استودیو آشنا شوید.
recyclerview در اندروید استودیو چیست
recyclerview در اندروید استودیو یک نسخه ی پیشرفته تر و انعطاف پذیر تر از ListView است. در RecyclerView، چندین مؤلفه ی (components) مختلف برای نمایش داده های شما با یکدیگر کار می کنند. RecyclerView خود را از View هایی که توسط یک layout manager ارائه می شود، پر می کند. شما می توانید از یکی از Layout Managers استاندارد (مانند LinearLayoutManager یا GridLayoutManager) استفاده کنید، یا برای خودتان پیاده سازی کنید. از LinearLayoutManager برای چیدمان تکی آیتم های RecyclerView به صورت افقی یا عمودی استفاده می شود، ولی از GridLayoutManager برای چیدمان دوتایی یا بیشتر آیتم های RecyclerView به صورت افقی یا عمودی استفاده می شود. [rlink pid=69280] Viewهای موجود در لیست توسط view holder objects نمایش داده می شود. این اشیاء نمونه هایی از کلاسی هستند، که شما با RecyclerView.ViewHolder آن ها را تعریف می کنید. هر View Holder وظیفه ی نمایش یک آیتم واحد را با یک View دارد. به عنوان مثال، اگر لیست شما مجموعه ای از موسیقی را نشان می دهد، ممکن است View Holder هر تک آلبوم را نگهداری کرده و نمایش دهد. RecyclerView فقط به تعداد مورد نیاز View Holder را برای نمایش محتوای پویا به علاوه چند مورد اضافی ایجاد می کند. با اسکرول (Scroll) کاربر از طریق لیست، RecyclerView، آیتم های خارج از صفحه را گرفته و آن ها را به داده هایی که در صفحه Scroll می شوند برمی گرداند. [rlink pid=69260] View Holder objects توسط یک آداپتور، که شما با توسعه ی RecyclerView.Adapter ایجاد می کنید، مدیریت می شود. آداپتور در صورت نیاز View Holder را ایجاد می کند. آداپتور همچنین View Holder را به داده های خود متصل (Bind) می کند. این کار با اختصاص دادن View Holder به Positon و فراخوانی متد ()onBindViewHolder آداپتور انجام می شود. این روش با استفاده از موقعیت View Holder بررسی می کند تا محتویات بر اساس موقعیت آن لیست مشخص شود.
این مدل رسایکلرویو کارهای بهینه سازی زیادی انجام می دهد:
- هنگامی که این لیست برای اولین بار جمع شد، برخی از View Holder ها در هر طرف لیست ایجاد و متصل می شود. به عنوان مثال، اگر View موقعیت های (Position) لیست 0 تا 9 را نشان می دهد، RecyclerView آن View Holder را ایجاد کرده و به آن متصل (Bind) می کند، و همچنین ممکن است View Holder را برای موقعیت 10 ایجاد و اتصال دهد. از این طریق، اگر کاربر لیست را Scroll کند، آیتم بعدی آماده ی نمایش است.
- از آنجا که کاربر در لیست Scroll می کند، RecyclerView در صورت لزوم View Holder جدید ایجاد می کند. همچنین View Holder هایی را که خارج از صفحه Scroll شده اند، ذخیره می کند تا بتوان از آن ها مجدد استفاده کرد. اگر کاربر جهت Scroll را تغییر دهد، View Holderهایی که از صفحه خارج شده بودند، می توانند به عقب برگردند. از طرف دیگر، اگر کاربر در همان جهت Scroll کند، View Holderهایی که زمانی طولانی در صفحه نمایش، نمایش داده نشدند، را می توان دوباره به داده های جدید متصل کرد.
- هنگامی که موارد نمایش داده شده تغییر می کنند، می توانید با فراخوانی یک متد مناسب ()...RecyclerView.Adapter.notify آداپتور را آگاه سازید.
اضافه کردن Support Library
برای دسترسی به ویجت RecyclerView، باید Support Library v7 را به پروژه ی زیر اضافه کنید:
- فایل build.gradle را در ماژول App باز کنید.
را به بخش وابستگی ها اضافه کنید.
dependencies {
implementation 'com.android.support:recyclerview-v7:28.0.0'
}اضافه کردن RecyclerView به Layout
اکنون می توانید RecyclerView را به پرونده ی طرح خود اضافه کنید. به عنوان مثال ، طرح زیر از RecyclerView به عنوان تنها View کل طرح (Layout) استفاده می کند:
<?xml version="1.0" encoding="utf-8"?>
<!-- A RecyclerView with some commonly used attributes -->
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/>پس از افزودن ویجت RecyclerView به Layout خود، شیء را هندل کنید، آن را به یک Layout Manager وصل کنید و یک آداپتور را برای نمایش داده ها Attach کنید.
اضافه کردن لیست آداپتور
برای تغذیه کلیه داده های خود در لیست، شما باید کلاس RecyclerView.Adapter را توسعه دهید. وقتی آیتم دیگر قابل مشاهده نیست، این شی View را برای آیتم ها ایجاد می کند، و محتوای برخی از Viewها را با داده های جدید جایگزین می کند. Layout Manager با استفاده از متد ()onCreateViewHolder در آداپتور آن را فراخوانی می کند. این متد نیاز به ساختن یک RecyclerView.ViewHolder دارد و View مورد نظر خود را برای نمایش محتویات خود تنظیم می کند. نوع ViewHolder باید با نوع اعلام شده در کلاس Adapter مطابقت داشته باشد. به طور معمول، با Inflat کردن یک فایل Xml Layout، این View را تنظیم می کند. از آنجا که View Holder هنوز به داده های خاصی اختصاص داده نشده است، متد در واقع محتوای View را تعیین نمی کند. [rlink pid=69231] سپس View Holder ،Layout Manager را به داده های خود متصل (Bind) می کند. این کار را با فراخوانی متد ()onBindViewHolder آداپتور و عبور از موقعیت View Holder در RecyclerView انجام می دهد. متد ()onBindViewHolder باید داده های مناسب را بارگیری کند، و از آن برای پر کردن view holder's layout استفاده کند. به عنوان مثال، اگر RecyclerView لیستی از نام ها را نشان می دهد، ممکن است متد نام مناسب را در لیست پیدا کند، و ویجت TextView را پر کند. اگر لیست به یک بروز رسانی نیاز دارد، از یک متد اطلاع رسانی در مورد RecyclerView.Adapter، مانند notifyItemChanged استفاده کنید. Layout Manager سپس هرکدام از View Holder ها را دوباره اصلاح می کند، و اجازه می دهد اطلاعات آن ها بروز شود.
سفارشی سازی ریسایکلرویو (Customize Your RecyclerView)
می توانید اشیاء RecyclerView را برای نیازهای خاص خود سفارشی کنید. کلاس های استاندارد تمام عملکردی را که بیشتر توسعه دهندگان به آن احتیاج دارند، را فراهم می کند. در بسیاری از موارد، تنها شخصی سازی که شما باید انجام دهید، طراحی View برای هر View Holder است و نوشتن کد برای بروزرسانی آن View ها با داده های مناسب است. با این حال، اگر برنامه شما الزامات خاصی دارد، می توانید رفتار استاندارد را به چند روش اصلاح کنید. [rlink pid=67225]
اصلاح طرح (Modifying The Layout)
recyclerview در اندروید استودیو از یک Layout Manager برای قرار دادن موارد جداگانه در صفحه و تعیین زمان استفاده مجدد از مواردی که دیگر برای کاربر قابل مشاهده نیست، استفاده می کند. برای استفاده مجدد (یا بازیافت مجدد) از یک View، یک Layout Manager می تواند از آداپتور بخواهد که محتوای View را با یک عنصر متفاوت از مجموعه داده جایگزین کند. Android Support Library شامل سه Layout Manager استاندارد است، که هر کدام گزینه های سفارشی سازی زیادی را ارائه می دهند:
- LinearLayoutManager موارد را در یک لیست یک بعدی مرتب می کند. استفاده از RecyclerView با LinearLayoutManager عملکردهایی مانند طرح ListView قدیمی تر را فراهم می کند.
- GridLayoutManager موارد را در یک شبکه دو بعدی مانند مربع های روی صفحه چرمی ترتیب می دهد. استفاده از RecyclerView با GridLayoutManager عملکردهایی مانند طرح GridView قدیمی تر را فراهم می کند.
- StaggeredGridLayoutManager موارد را در یک شبکه دو بعدی مرتب می کند و هر ستون کمی مانند ستاره های موجود در پرچم آمریکا می باشد.
اگر هیچ کدام از این Layout Managerها متناسب با نیازهای شما نیستند، می توانید با گسترش کلاس انتزاعی RecyclerView.LayoutManager کلاس خود را ایجاد کنید.
مثالی از ساخت recyclerview در اندروید استودیو (Android RecyclerView Example)
در فایل activity_main.xml در برنامه ، ویجت RecyclerView را اضافه کنید.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
android:id="@+id/recyclerView"
tools:context="example.javatpoint.com.recyclerviewlist.MainActivity">
</android.support.v7.widget.RecyclerView> یک پرونده dimens.xml در فایل Value ایجاد کنید و کد زیر را اضافه کنید.
dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="ic_clear_margin">56dp</dimen>
</resources> با کد زیر یک طرح سفارشی در list_item.xml ایجاد کنید.
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:id="@+id/relativeLayout"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeightLarge"
android:background="@drawable/border">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_marginStart="@dimen/activity_horizontal_margin"
android:layout_marginEnd="@dimen/activity_horizontal_margin"
android:contentDescription="Icon" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_toEndOf="@id/imageView"
android:layout_toRightOf="@id/imageView"
android:gravity="center_vertical"
android:textSize="16sp"/>
</RelativeLayout> یک پرونده border.xml را در Drawable ایجاد کنید که برای تزیین موارد RecyclerView استفاده می شود.
border.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="https://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#FFFFFF" />
<stroke
android:width="1dp"
android:color="#CCCCCC" />
</shape> با کد زیر کلاس MyListData.java ایجاد کنید. این کلاس به عنوان کلاس (POJO) استفاده می شود که خصوصیات آیتم ها را تعیین می کند.
MyListData.java
package example.sevenlearn.com.recyclerviewlist;
public class MyListData{
private String description;
private int imgId;
public MyListData(String description, int imgId) {
this.description = description;
this.imgId = imgId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getImgId() {
return imgId;
}
public void setImgId(int imgId) {
this.imgId = imgId;
}
} یک کلاس MyListAdapter.java ایجاد کنید و کد زیر را اضافه کنید.
MyListAdapter.java
package example.sevenlearn.com.recyclerviewlist;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
public class MyListAdapter extends RecyclerView.Adapter<MyListAdapter.ViewHolder>{
private MyListData[] listdata;
// RecyclerView recyclerView;
public MyListAdapter(MyListData[] listdata) {
this.listdata = listdata;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View listItem= layoutInflater.inflate(R.layout.list_item, parent, false);
ViewHolder viewHolder = new ViewHolder(listItem);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final MyListData myListData = listdata[position];
holder.textView.setText(listdata[position].getDescription());
holder.imageView.setImageResource(listdata[position].getImgId());
holder.relativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(),"click on item: "+myListData.getDescription(),Toast.LENGTH_LONG).show();
}
});
}
@Override
public int getItemCount() {
return listdata.length;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ImageView imageView;
public TextView textView;
public RelativeLayout relativeLayout;
public ViewHolder(View itemView) {
super(itemView);
this.imageView = (ImageView) itemView.findViewById(R.id.imageView);
this.textView = (TextView) itemView.findViewById(R.id.textView);
relativeLayout = (RelativeLayout)itemView.findViewById(R.id.relativeLayout);
}
}
}
Finally, in the MainActivity.java class, add the following code. This class creates the array of items for MyListData class and set the adapter class to RecyclerView.
MainActivity.java
package example.javatpoint.com.recyclerviewlist;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyListData[] myListData = new MyListData[] {
new MyListData("Email", android.R.drawable.ic_dialog_email),
new MyListData("Info", android.R.drawable.ic_dialog_info),
new MyListData("Delete", android.R.drawable.ic_delete),
new MyListData("Dialer", android.R.drawable.ic_dialog_dialer),
new MyListData("Alert", android.R.drawable.ic_dialog_alert),
new MyListData("Map", android.R.drawable.ic_dialog_map),
new MyListData("Email", android.R.drawable.ic_dialog_email),
new MyListData("Info", android.R.drawable.ic_dialog_info),
new MyListData("Delete", android.R.drawable.ic_delete),
new MyListData("Dialer", android.R.drawable.ic_dialog_dialer),
new MyListData("Alert", android.R.drawable.ic_dialog_alert),
new MyListData("Map", android.R.drawable.ic_dialog_map),
};
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
MyListAdapter adapter = new MyListAdapter(myListData);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
}
} خروجی این برنامه:

جمع بندی:
در این مقاله شما با ساخت RecyclerView در اندروید استودیو آشنا شدید، و مثالی از نحوه ایجاد آن در اندروید استودیو را دیدید، شما با استفاده از RecyclerView در اندروید استودیو به جای لیست می توانید، از ایجاد لگ و کندی در اپلیکیشن خود زمانی که تعداد آیتم های یک شکل شما برای نمایش زیاد است، جلوگیری کرده و سرعت و کارایی برنامه را بهتر کنید.
اگر به یادگیری بیشتر در زمینه ی اندروید علاقه داری، با شرکت در دوره ی آموزش برنامه نویسی اندروید در کمتر از یکسال به یک توسعه دهنده اندروید همه فن حریف تبدیل می شوی که آماده ی استخدام، دریافت پروژه و حتی پیاده سازی اپلیکیشن خودت هستی.