داشتن چند نوع view در RecyclerView

تو چند تا نوشته‌ی قبلی RecyclerView رو معرفی کردم و گفتم که اومده تا پروفورمنس بهتری به اپلیکشینهایی که به طور سنگین از لیست استفاده میکنند بده. الان میخوام در مورد یه کاربرد دیگه این کلاس جدید بگم.

کار دیگه‌ای که RecyclerView انجامش رو برامون حسابی راحت کرده، داشتن چند مدل view مختلف در داخل یک لیسته. قبلا این کار ساده نبود و انجامش گاهی پرفورمنس رو حسابی پایین میاورد. اما الان با RecyclerView زندگی کمی بهتر شده.

ترجیح میدم به جای اینکه توضیحات فارسی بدم،‌ مستقیما کد رو بنویسم و تا شما با خوندن کد،‌ متوجه مکانیزم کار بشید. کد زیر رو ببینید:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

      @Override
    public int getItemViewType(int position) {
        return position%2;
    }

   
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {


        if (viewType == 0) {
            View view = LayoutInflater.from(activity).inflate(R.layout.first_view, parent, false);
            return new FirstViewHolder(view);
        } else {
            View view = LayoutInflater.from(activity).inflate(R.layout.second_view, parent, false);
            return new SecondViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof FirstViewHolder) {
            .
            .
            .

        } else {
            .
            .
            .

        }

    }


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


    public class FirstViewHolder extends RecyclerView.ViewHolder {
       

        public FirstViewHolder(View view) {
            super(view);
            
        }
    }

    public class SecondViewHolder extends RecyclerView.ViewHolder {
        public SecondViewHolder(View view) {
            super(view);
        }
    }
}

حالا توضیحات مختصری در مورد متدهای این کلاس میدم:

public int getItemViewType(int position)

این متد برای مایی که میخوایم چند نوع view داشته باشیم اصلی‌ترین کار رو انجام میده. تو این متد میتونیم با محاسباتی که روی position انجام میدیم یک مقدار برگردونیم. این مقدار بعدا به ما کمک میکنه که تصمیم بگیریم کدوم view رو نمایش بدیم. کاری که من کردم اینه که باقی مونده تقسیم position به ۲ رو برمیگردونم تا بر اساس مقدار view دلخواهم رو نشون بدم.

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 

این متد مقداری که متد قبلی برگردونده رو به اسم viewType در ورودی میگیره. من تو کلاس بالا چک میکنم و بر اساس اینکه این مقدار صفره یا یک، view دلخواهم رو inflate میکنم و ViewHolder دلخواهم رو برمیگردونم.

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)

ViewHolderی که تو متد قبلی برگردوندم اینجا به عنوان ورودی میگیرم. کار اصلی‌ای که تو این متد انجام میشه اینه که ظاهر view رو کامل میکنم. مثلا اگر view من قراره که یه TextView داشته باشه، اون رو در این متد setText میکنم.

public int getItemCount()

این رو هم که هممون میشناسیم. میگه که قراره این لیست چند تا view داشته باشه.

public class FirstViewHolder extends RecyclerView.ViewHolder

public class SecondViewHolder extends RecyclerView.ViewHolder

این دوتا هم که ViewHolderهای ما هستند. یکی برای viewهای فرد و دیگری برای viewهای زوج.

سعی کردم تا حد ممکن خلاصه توضیح بدم. اما اگر سوالی بود در کامنت‌ها بپرسید. حتما جواب خواهم داد.

 

3 پاسخ به “داشتن چند نوع view در RecyclerView”

  1. مهدیکو گفت:

    من چهار نوع آیتم مختلف رو با استفاده از listview پیاده سازی کردم.(با استفاده از getItemViewType)
    توی لیست ویوها نکته ای که خیلی مهمه تعریف کردن تمام else هاست! منظورم اینه که وقتی توی یک if یک view رو مثلا مخفی میکنید بعد با اسکرول کردن به بالا و پایین لیست قاطی میکنه و اشتباهی یکی دیگه رو میبینید که مخفی شده و موارد مشابه. امیدوارم این موضوع توی recycleview حل شده باشه(؟)

    • آرش خوئینی گفت:

      درسته. اگه منظورتون رو درست فهمیده باشم این مشکل به این خاطر اینه که ListView سعی میکنه viewها رو استفاده مجدد کنه. تا جایی که میدونم و تجربه کردم همچین مشکلی تو RecyclerView وجود نداره.

  2. مهدیکو گفت:

    به نظر من holder instanceof FirstViewHolder اشتباه است. هدف اصلی ریسایکل ویو پرفرومنس بالا هست و استفاده از instanceof خیلی پرفرومنس پایینی داره.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

android application Google I/O HomeBrew ImageMagick Material Design mobile PogressBar RecyclerView splash TEDxKish ux آموزش اندروید الوین تافلر اندروید اپلیکیشن برنامه نویسی برنامه نویسی اندروید برنامه‌نویسی برنامه‌نویسی اندروید تداکس کیش تعمیر تغییر سایز عکس با ترمینال خلاصه کتاب دانش داده دانشگاه دانشگاه ایده‌آل دزد دیتا ساینس رشته مهندسی کامپیوتر ریکامندرسیستم سیستم‌های توصیه‌گر فری‌لنس لپتاپ متریال دیزاین معرفی کتاب موج سوم نوار پیشرفت همایش هوش مصنوعی ُجزیره کیش کار کسب و کار یادگیری عمیق یادگیری ماشین