بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

آموزش ساخت Recycler View و CardView

مدیریت گفتگو
CodeMaster 11 سال پیش
آخرین تغییر: 9 سال پیش

خوب بدلیل درخواست یکی از دوستان آموزش ساخت Recycler View و CardView رو هم قرار میدم. امیدورام به کارتون بیاد

1- Recycler View

خوب اگه تاپیک آموزش ساخت تولبار رو دیده باشید یک لیستی هم اونتو هست که درواقع اون یک Recycler View هستش ساخت Recycler View شبیه ListView هستش و البته از نوع خیلی ساده ترش.

نظرات

CodeMaster 11 سال پیش
recycler view توی api21 معرفی شده و یکجور لیست ویو هستش در واقع همون لیست ویو هستش حالا optimize شده و همچنین ساده تر هم شده
hhgh4269 10 سال پیش
لینک تایپیک ساخت تولبار خرابه و فکر کنم درستش این باشه لینک

پاسخ‌ها 3

CodeMaster 11 سال پیش

خوب ابتدا باید dependency مربوطه رو در فایل build.Gradle قرار بدید:

 compile 'com.android.support:recyclerview-v7:21.0.+'

سپس باید اونو در xml که می خواید نشونش بدید قرار بدید:

 android.support.v7.widget.RecyclerView
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/recyclerView"
/>

سپس یک xml برای Adapter می خوایم که اونو طراحی می کنیم.

حالا یک کلاس جدید می سازیم مثل همون StructNote که استاد در لیست ویو آموزش دادند

 public class StructName {

public String firstName;
public String lastName;
public int age;
}

و  حالا نوبت به ساخت Adapter می رسه :

 public class PersonAdapter extends RecyclerView.Adapter<PersonAdapter.PersonViewHolder>{

public static class PersonViewHolder extends RecyclerView.ViewHolder{

protected Button btnAdapter;
protected TextView txtAdapter;
protected CheckBox chkAdapter;

public PersonViewHolder(View itemView) {
super(itemView);
btnAdapter = (Button) itemView.findViewById(R.id.btnAdapter);
txtAdapter = (TextView) itemView.findViewById(R.id.txtAdapter);
chkAdapter = (CheckBox) itemView.findViewById(R.id.chkAdapter);
}
}

private ArrayList<StructName> names = new ArrayList<>();

public PersonAdapter(ArrayList<StructName> names){
this.names = names;
}

@Override
public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = G.inflater.from(viewGroup.getContext()).inflate(R.layout.adapter_person,viewGroup,false);
return new PersonViewHolder(view);
}

@Override
public void onBindViewHolder(PersonViewHolder personViewHolder, final int i) {
StructName name = names.get(i);
personViewHolder.txtAdapter.setText(name.firstName);
personViewHolder.chkAdapter.setText(name.lastName);
personViewHolder.btnAdapter.setText(""+name.age);
}

@Override
public int getItemCount() {
return names.size();
}



@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
}

حالا همه رو براتون توضیح میدم:

خوب کلاس ما که باید از RecyclerView.Adapter اکستند بشه که اون هم جنریک هستش و  باید یک کلاس که از RecyclerView.ViewHolder اکستند شده بهش داده بشه. دقت کنید که کلاس RecyclerView.ViewHolder رو باید خودتون بسازید. این کلاس رو وقتی اکستند می کنید از RecyclerView.Adapter سه تا متد رو باید override کنید که :

()getItemCount : این متد در واقع تعیین کننده تعداد آیتم هایی هستش که Recycler View ما باید نشون بده از اونجایی که کلاس ما یک Constructor از نوع آرایه داره (که باید خودمون بسازیمش) و عناصر این ویو از همین آرایه پر میشن پس ما فقط کافیه تعداد عناصر آرایه رو بهش برگردونیم

()onCreateViewHolder: این متد وقتی صدا زده میشه که اون ViewHolder  ای که ساختیم باید initialize بشه. ما در واقع در این متد Xml که قراره Recycler View از روی اون عناصرش رو بسازه معرفی می کنیم و  سپس از کلاس ViewHolder که ساختیم بهش Return می کنیم.

()onBindViewHolder: در این متد در واقع عناصر ویو ای که ساختیم رو initialize می کنیم در واقع همون عمل متد getView در لیست ویو رو انجام میده

در نهایت باید متد onAttachedToRecyclerView رو خودمون دستی override کنیم

حالا باید بریم سمت اکتیویتی که قراره این Recycler View رو توش نشون بدیم

Recycler View برای نمایش به یک LayoutManager نیاز داره پس ما اونو به این ترتیب می سازیم:

  RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
LinearLayoutManager manager = new LinearLayoutManager(G.context);
manager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(manager);
PersonAdapter adapter= new PersonAdapter(G.names);
populateData();
recyclerView.setAdapter(adapter);

متد setHasFixedSize() رو فقط در صورتی که RecyclerView موقعیت ثابتی داره استفاده کنید طبق گفته Documentaion باعث ارتقا performance میشه حالا چجوری نمیدونم و باید به قول استاد از کلیشه ای بگذریم!

متد populateData() هم که برای پر کردن عناصر آرایه با مقادیر fake هستش و به این شکل نوشتمش:

  private void populateData(){
G.names.clear();
for (int i=0;i<15;i++){
StructName name = new StructName();
name.firstName = "First Name#"+i;
name.age = i;
name.lastName = "last Name#"+i;
G.names.add(name);
}

و دیگه تمام RecyclerView ساخته شده و آماده است. فقط دقت کنید که در RecyclerView نیازی به adapter.NotifyDataSetChanged() نیستش

امیدوارم بدردتون خورده باشه.

نظرات

Ali 11 سال پیش
onAttachedToRecyclerView رو نمیشناسه؟
CodeMaster 11 سال پیش
مطمئنید که لایبرری رو درست ایمپورت کردید؟
Ali 11 سال پیش
بله درست ایمپورت شده، البته کلا متد onAttachedToRecyclerView رو پاک کردم درست کار میکنه. حالا متد onAttachedToRecyclerView چکار میکنه؟
CodeMaster 11 سال پیش
در واقع رفتاری رو که بعد از attach شدن layoutManager به recyclerView قراره نشون بده تعیین میکنیم همونجوری که اینجا هم دیدید من هم بدنه متد رو خالی گذاشتم
سپهر 11 سال پیش
آیا با این manager.setOrientation(LinearLayoutManager.VERTICAL); میشه یک لیست ویوی افقی هم ساخت؟ یا هنوز اندروید فکری به حالش نکرده ؟!!
CodeMaster 11 سال پیش
حقیقتش من نا حالا خودم به این موضوع فکر نکرده بودم یک سرچی در گوگل زدم ظاهرا میشه این کار رو کرد و دقیقا به جای LinearLayoutManager.VERTICAL باید از LinearLayoutManager.HORIZONTAL استفاده کرد
Hajhosseini 11 سال پیش
بله امکانش هست سپهر جان، میتونید با خیال راحت از LinearLayoutManager.HORIZONTAL استفاده کنید، در صورتی که موفق نشدید بگید براتون سورس درج کنیم.
118674 10 سال پیش
در کلاس G names را چطوری تعریف کنیم ؟ در خط PersonAdapter adapter= new PersonAdapter(G.names); از کلاس G خطا میگیره
RezaM 10 سال پیش
سلام ، چطوری کلیک روی آیتم ها رو مدیریت کنیم ؟ طبق همون آموزش لیست ویوی استاد ؟
CodeMaster 10 سال پیش
بله به روشی که استاد آموزش دادند میشه. یک روش دیگه هم هست که در این لینک توضیح داده شده. لینک
ایمان 10 سال پیش
توی کلاس names Gرو چطوری تعریف کنیم؟؟؟
Sara.gh 10 سال پیش
names داخل کلاس G چی و از چه نوعی هست؟کدهای کلاس G رو هم لطفا قرار بدید.
CodeMaster 11 سال پیش

خوب برای مرتب بودن انجمن آموزش CardView رو هم همینجا قرار میدم.

CardView در واقع یک ViewGroup هستش پس رفتاری کاملا مشابه با اونها داره.

برای ساختن CardView ابتدا باید dependency مربوطه رو در فایل build.Gradle قرار بدید:

 compile 'com.android.support:cardview-v7:21.0.+'

حالا توی فایل xml ای که می خواید CardView رو توش نمایش بدید بدین شکل عمل کنید:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<android.support.v7.widget.CardView
android:layout_height="match_parent"
android:layout_width="match_parent"
android:layout_gravity="center"
card_view:cardCornerRadius="10dp"
card_view:cardBackgroundColor="#C92A2A">

<RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent">
<ImageView android:layout_width="match_parent" android:layout_height="match_parent"
android:src="@drawable/pic"
android:scaleType="fitXY"
android:layout_margin="23dp"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content"
android:text="Hello World"
android:textColor="#ffffff"
android:layout_margin="33dp"
android:textSize="22dp"/>
</RelativeLayout>
</android.support.v7.widget.CardView>

</LinearLayout>

خوب کلا چیز زیاد سخت و پیچیده ای نداره فقط 2 تا property مهم داره که درمورد اونها یک توضیح مختصر میدم:

اولین و مهمترین property این ویو cardCornerRadius هستش که درواقع به CardView ما Radius میده که اینجا من مقدارش رو برابر 10dp قرار دادم

دیگری cardBackgroundColor هستش که رنگ پس زمینه CardView رو توش مشخص می کنیم.

این هم یک عکس از cardView ای که من ساختم:

امیدوارم مفید واقع بشه

نظرات

من در اکلیپس ازش استفاده کردم؛فورس کلوز میده برنامم
CodeMaster 11 سال پیش
احتمال داره لایبرری رو درست include نکردید محتویات logCat رو بزارید ببینیم چشه
CodeMaster 11 سال پیش
CardView اطلاعات رو داخل کارت نشون میده و شما می تونید بهش radius بدید و امکانات مختلف دیگه اما کلا فلسفه ایجادش اینه که عناصر recyclerView با استفاده از cardView پر بشه.
alisherafat01 11 سال پیش
این عکسی که گذاشتید لود نمیشه که ببینیم چی هس این card
CodeMaster 11 سال پیش
برای من که داره نشون میده مشکلی نداره - توضیحاتش رو هم بالا دادم
zrezvani 10 سال پیش
توضیحاتتون فوق العاده بود، خیلی خیلی از زحماتتون ممنونم موفق باشید...
MarAnd 9 سال پیش
سلام ، من یه کارد ویو دارم و می خام ک این کارد ویو ، کج توی صفحه قرار بگیره . می دونین چه طوری باید پیاده سازیش کنم ؟؟ ممنون .
Majid Arabi 10 سال پیش

یک property مهم دیگه هم داره که "cardView:cardElevation="4dp هست . که به cardView سایه میده و جذاب ترش میکنه! (:

نظرات

mahdiFar77 10 سال پیش
لطف میکنین تو اکلیپس هم توضیح بدین؟
mahdiFar77 10 سال پیش
تو اندروید استودیو تونستم انجام بدم فقط recycleView رو میخام بصورت افقی اسکرول بشه اینم android:scrollbars="horizontal" ست کردم ولی بازم نشد .چطوری باید تنظیم کنم؟

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .