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

آموزش پیاده سازی کلاس آداپتر برای RecyclerView

مسعود فرمانی  9 سال پیش  8 سال پیش
+5 0

  1. منطق پیاده سازی آداپتر RecyclerView تقریبا مشابه با ListView هستش و فک میکنم فقط متدهایی که override میشن متفاوت باشن..به هر حال با استفاده از آموزش زیر میتونید با مسایل پایه ایِ پیاده سازی کلاس AdapterRecyclerView آشنا بشید..
  2. قبل از هرکاری نیاز دارید که recylcerview dependency  رو به پروژه تون اضافه کنید (مثل کاری که من کردم)
  1. در مرحله دوم ویجت recyclerview رو به لایه ای که میخواین ، اضافه کنید(مثلا من به لایه activity_main اضافش کردم)
  2.  <?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>
     
  1. حالا نوبت به نوشتن کلاس آداپتر و کلاسی که داده هاش رو با استفاده از آداپتر در ویجت recyclerview تزریق می کنیم..
  2. خب من کلاسی به اسم StructItem ساختم:
  3.  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;
    }
    }
     
  4. حالا یه لایه (layout) که متناسب با کلاس StructItem  و داده هایی که قصد نمایش یا پردازش اونها رو داریم برای آداپتر می سازیم:
  5. اسمشو میذارم adapter_recycler_view
  6.  <?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>
     
  7. حالا میرسیم به مهترین قسمت ماجرا ، یعنی نوشتن کلاس AdapterRecyclerView که وظیفش ساختن لایه های (inflate کردن) adapter_recycler_view و رندر کردن داده های StructItem ها و قرار دادن آیتم مناسب در لایه ی مناسب است :
  8. 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();//مقدار خروجی این متد باید برابر با اندازه آرایه درونیِ اداپتر باشه
    }
    }

     
  9. (سعی شده توی کامنت ها سازوکار کدها واضحتر شن ، با این حال اگه سوالی داشتید حتما خودتون بپرسید)
  10. خب حالا من میام توی کلاس ActivityMain یک آرایه از StructItemها می سازم و مقدار دهی میکنم و همینطور یک نمونه از کلاس آداپتر می سازم و اون آرایه رو به آداپتر ارسال می کنم :
  11.  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 سال پیش)
 برای این سوال پاسخی وجود ندارد.

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