آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

CodeMaster  10 سال پیش  8 سال پیش
+51 0

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

1- Recycler View

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

+1 0
recycler viewچه کاربردی داره ؟ (10 سال پیش)
+4 0
recycler view توی api21 معرفی شده و یکجور لیست ویو هستش در واقع همون لیست ویو هستش حالا optimize شده و همچنین ساده تر هم شده (10 سال پیش)
+3 0
لینک تایپیک ساخت تولبار خرابه و فکر کنم درستش این باشه لینک (9 سال پیش)
 برای این سوال 3 پاسخ وجود دارد.
پاسخ به سوال 
CodeMaster  10 سال پیش
+23 0

خوب ابتدا باید 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() نیستش

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

+1 0
onAttachedToRecyclerView رو نمیشناسه؟ (10 سال پیش)
0 0
مطمئنید که لایبرری رو درست ایمپورت کردید؟ (10 سال پیش)
0 0
بله درست ایمپورت شده، البته کلا متد onAttachedToRecyclerView رو پاک کردم درست کار میکنه. حالا متد onAttachedToRecyclerView چکار میکنه؟ (10 سال پیش)
+1 0
در واقع رفتاری رو که بعد از attach شدن layoutManager به recyclerView قراره نشون بده تعیین میکنیم همونجوری که اینجا هم دیدید من هم بدنه متد رو خالی گذاشتم (10 سال پیش)
0 0
آیا با این manager.setOrientation(LinearLayoutManager.VERTICAL); میشه یک لیست ویوی افقی هم ساخت؟ یا هنوز اندروید فکری به حالش نکرده ؟!! (10 سال پیش)
+1 0
حقیقتش من نا حالا خودم به این موضوع فکر نکرده بودم یک سرچی در گوگل زدم ظاهرا میشه این کار رو کرد و دقیقا به جای LinearLayoutManager.VERTICAL باید از LinearLayoutManager.HORIZONTAL استفاده کرد (10 سال پیش)
+3 0
بله امکانش هست سپهر جان، میتونید با خیال راحت از LinearLayoutManager.HORIZONTAL استفاده کنید، در صورتی که موفق نشدید بگید براتون سورس درج کنیم. (10 سال پیش)
+1 0
در کلاس G names را چطوری تعریف کنیم ؟ در خط PersonAdapter adapter= new PersonAdapter(G.names); از کلاس G خطا میگیره (9 سال پیش)
0 0
سلام ، چطوری کلیک روی آیتم ها رو مدیریت کنیم ؟ طبق همون آموزش لیست ویوی استاد ؟ (9 سال پیش)
0 0
بله به روشی که استاد آموزش دادند میشه. یک روش دیگه هم هست که در این لینک توضیح داده شده. لینک (9 سال پیش)
0 0
توی کلاس names Gرو چطوری تعریف کنیم؟؟؟ (8 سال پیش)
0 0
names داخل کلاس G چی و از چه نوعی هست؟کدهای کلاس G رو هم لطفا قرار بدید. (8 سال پیش)
پاسخ به سوال 
CodeMaster  10 سال پیش
+15 0

خوب برای مرتب بودن انجمن آموزش 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 ای که من ساختم:

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

0 0
cardview چه کاربردی داره ؟ (10 سال پیش)
0 0
من در اکلیپس ازش استفاده کردم؛فورس کلوز میده برنامم (10 سال پیش)
+1 0
احتمال داره لایبرری رو درست include نکردید محتویات logCat رو بزارید ببینیم چشه (10 سال پیش)
0 0
کاربرد این ویو چیه؟ (10 سال پیش)
0 0
CardView اطلاعات رو داخل کارت نشون میده و شما می تونید بهش radius بدید و امکانات مختلف دیگه اما کلا فلسفه ایجادش اینه که عناصر recyclerView با استفاده از cardView پر بشه. (10 سال پیش)
0 0
این عکسی که گذاشتید لود نمیشه که ببینیم چی هس این card (9 سال پیش)
0 0
برای من که داره نشون میده مشکلی نداره - توضیحاتش رو هم بالا دادم (9 سال پیش)
0 0
(9 سال پیش)
0 0
(9 سال پیش)
0 0
(9 سال پیش)
+2 0
توضیحاتتون فوق العاده بود، خیلی خیلی از زحماتتون ممنونم موفق باشید... (9 سال پیش)
0 0
سلام ، من یه کارد ویو دارم و می خام ک این کارد ویو ، کج توی صفحه قرار بگیره . می دونین چه طوری باید پیاده سازیش کنم ؟؟ ممنون . (8 سال پیش)
پاسخ به سوال 
Majid Arabi  9 سال پیش
+8 0

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

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

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