بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
آموزش پیاده سازی کلاس آداپتر برای RecyclerView
- منطق پیاده سازی آداپتر RecyclerView تقریبا مشابه با ListView هستش و فک میکنم فقط متدهایی که override میشن متفاوت باشن..به هر حال با استفاده از آموزش زیر میتونید با مسایل پایه ایِ پیاده سازی کلاس AdapterRecyclerView آشنا بشید..
- قبل از هرکاری نیاز دارید که recylcerview dependency رو به پروژه تون اضافه کنید (مثل کاری که من کردم)

- در مرحله دوم ویجت recyclerview رو به لایه ای که میخواین ، اضافه کنید(مثلا من به لایه activity_main اضافش کردم)
-
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical" />
</RelativeLayout>
- حالا نوبت به نوشتن کلاس آداپتر و کلاسی که داده هاش رو با استفاده از آداپتر در ویجت recyclerview تزریق می کنیم..
- خب من کلاسی به اسم StructItem ساختم:
-
public class StructItem {
private String title;
private String content;
private boolean isChecked;
/////
public boolean getChecked() {
return isChecked;
}
public String getContent() {
return content;
}
public String getTitle(){
return title;
}
/////////////
public void setTitle(String title){
this.title = title;
}
public void setContent(String content){
this.content = content;
}
public void setChecked(boolean isChecked){
this.isChecked = isChecked;
}
} - حالا یه لایه (layout) که متناسب با کلاس StructItem و داده هایی که قصد نمایش یا پردازش اونها رو داریم برای آداپتر می سازیم:
- اسمشو میذارم adapter_recycler_view
-
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content"><!--دقت کنید که مقدار پروپرتی ارتفاع اولین آیتم لایه (layout_root) حتما باید wrap_content باشه و گرنه آیتم های recyclerview با فاصله زیادی از هم نمایش داده می شوند -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:id="@+id/txtTitle"
android:layout_toLeftOf="@+id/checkBox"
android:layout_toStartOf="@+id/checkBox"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/checkBox"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:id="@+id/txtContent"
android:layout_below="@+id/txtTitle"
/>
</RelativeLayout> - حالا میرسیم به مهترین قسمت ماجرا ، یعنی نوشتن کلاس AdapterRecyclerView که وظیفش ساختن لایه های (inflate کردن) adapter_recycler_view و رندر کردن داده های StructItem ها و قرار دادن آیتم مناسب در لایه ی مناسب است :
-
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;
import java.util.ArrayList;
public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.MyViewHolder>{
ArrayList<StructItem> itemList;
AdapterRecyclerView(ArrayList<StructItem> items){//سازنده کلاس آداپتر
this.itemList = items;
}
public class MyViewHolder extends RecyclerView.ViewHolder{//یه کلاس viewholder دلخواه بسازید و از viewholder خودِ recyclerview ارث بری کند
public TextView txtTitle,txtContent;
public CheckBox checkBox;
public MyViewHolder(View itemView) {//سازنده کلاس viewholder
super(itemView);
txtTitle = (TextView) itemView.findViewById(R.id.txtTitle);
txtContent = (TextView) itemView.findViewById(R.id.txtContent);
checkBox = (CheckBox) itemView.findViewById(R.id.checkBox);
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {//دقت کنید اینجا کلاس خروجی از متد دقیقا باید کلاس viewHolder که خودتون نوشتید باشه
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_recycler_view,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {//و همینطور اینجا ورودی متد باید کلاس viewHolder که خودتون ایجاد کردید باشه
StructItem item = itemList.get(position);
holder.txtTitle.setText(item.getTitle());
holder.txtContent.setText(item.getContent());
holder.checkBox.setChecked(item.getChecked());
//عملیت اتصال داده ها به لایه ها در این متد انجام می شود
}
@Override
public int getItemCount() {
return itemList.size();//مقدار خروجی این متد باید برابر با اندازه آرایه درونیِ اداپتر باشه
}
} - (سعی شده توی کامنت ها سازوکار کدها واضحتر شن ، با این حال اگه سوالی داشتید حتما خودتون بپرسید)
- خب حالا من میام توی کلاس ActivityMain یک آرایه از StructItemها می سازم و مقدار دهی میکنم و همینطور یک نمونه از کلاس آداپتر می سازم و اون آرایه رو به آداپتر ارسال می کنم :
-
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
public class ActivityMain extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<StructItem> items = new ArrayList<>();
for (int i = 1 ;i < 35 ; i++){
StructItem item = new StructItem();
item.setTitle("Title " + i);
item.setContent("Content " + i);
if ((i % 2) == 0){//آیتم هایی شماره زوج رو چک خورده قرار میدم
item.setChecked(true);
}
items.add(item);//آیتم مقداردهی شده رو به لیستی که همه آیتم ها رو در بر میگیره اضافه می کنم
}
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(mLayoutManager);
AdapterRecyclerView adapter = new AdapterRecyclerView(items);//لیست آیتم های مقداردهی شده رو به اداپتر ارسال میکنم
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
} 
0
0
سلام و درود
آقا من می خوام یه recyclerview پیاده سازی کنم که با کلیک روی یک ایتم سایر ایتم ها false بشه ( در مثال شما اگه روی یکی کلیک کرد سایر آیتم ها false بشه )
چطور می تونم چنین کاری انجام بدم (8 سال پیش)
برای این سوال پاسخی وجود ندارد.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .