درمورد متدgetItemViewType

پرسیده شده
فعالیت 1135 روز پیش
دیده شده 488 بار
0

سلام خسته نباشید 

استاد از یک از یک متد در adapter استفاده کردن به اسمgetItemViewType می خواستم بدونم کارای این متد چیست ؟؟

با تشکر

فایل پیوست

رحیم محمودزاده
رحیم محمودزاده

15 اسفند 99

1
حذف شده

سلام و احترام

 

استفاده از این متد برمیگرده به سرفصل FileManager که امدیم با اورراید کردن این متد viewtype رو مشخص کردیم (اگر خاطرتون باشه اونجا از enum استفاده کردیم) این متن رو جهت یاداوری نوشتم .

 

اما در پروژه مد نظر با اورراید کردن getItemViewType مشخص کردیم که اگر position برابر بود با سایز آیتم های سبد خرید بیا viewtype  برابر با VIEW_TYPE_PURCHASE_DETAIL قرار بده 

اما چرا این کارو کردیم ؟

برای اینکه در متد onCreateViewHolder مشخص کنیم که کدام لیوت بسته به شرایط inflate شود.(در پروژه فعلی در صفحه سبد خرید یک لیوت جهت مشاهده لیست محصولات اینفلیت میشود و یک لیوت جهت نمایش قیمت )

مثلا هنگامی که position برابر با مقدار سایز ایتم های سبد خرید باشه برای ما لیوت item_purchase_details اینفلیت خواهد شد در غیر این صورت لیوت item_cart برای نمایش محصولات در سبد خرید نمایش داده خواهد شد .

PurchaseDetailViewHolder(
                LayoutInflater.from(parent.context)
                    .inflate(R.layout.item_purchase_details, parent, false)
            )

 یک مثال دیگر

در مثال زیر گفته شده اگر viewtype برابر با COUNTRY بود بیا و لیوت item_country رو اینفلیت کن و در غیر این صورت item_state که مربوط به لیوت استان هست رو.

@Override
    public int getItemViewType(int position) {
      if(lists.get(position) instanceof Country)
                return COUNTRY;
            else if(lists.get(position) instanceof States)
                 return STATE;
            else
                return -1;
    }

   @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     RecyclerView.ViewHolder viewHolder = null;
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());

        if(viewType ==  COUNTRY){
            View v1 = inflater.inflate(R.layout.item_country, parent, false);
            viewHolder = new CountryViewHolder(v1);
        }else if(viewType == STATE){
            View v1 = inflater.inflate(R.layout.item_state, parent, false);
            viewHolder = new StateViewHolder(v1);
        }
            return viewHolder;
    }
فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

16 اسفند 99

حذف شده
خیل ی ممنون ولی پوریا جان ما در این قسمت با سبد خرید کار نکرده بودیم با تغییر نمایش ایتم ها داشتیم کار می کردیم
رحیم محمودزاده

18 اسفند 99

0
حذف شده

سلام وقت بخیر 

اون مورد هم کاملا شبیه اونی هست که در جلسه FileManager تدریس شد اگر خاطرتون باشه در اونجا هم نوع نمایش ایتم ها برامون چالش بود که با این روش انجام دادم اما بریم سراغ توضیح

 

ما ابتدا اومدیم و ثابت هایی در نظر گرفتیم نوع ROUND و SMALL و LARGE (این کارو میتونستیم با enum هم انجام بدیم )

بعد از اون مشخص کردیم که اگر کاربر نوع روی ImageView یی که تعریف کردیم کلیک کرد بیا و نحوه نمایش رو تغییر بده اما چطوری؟ با استفاده از when که رفتارش شبیه switch در جاوا هست مشخص کردیم که اگر نوع ما ROUND یعنی VIEW_TYPE_ROUND بود بیا و لیوت item_product رو inflate کن (به اون قسمت *** در کد توجه کنین)و به همین ترتیب اگر نوع SMALL بود بیا و item_product_small رو inflate کن و به همین ترتیب .

نکته : ما برای when نمیتونیم else رو نذاریم برای همین یه IllegalStateException ست کردیم صرفا برای خودمون (این خط کد برای برنامه نویس هست و در این مثال مطمینیم که اجرا نمیشه)

با این روش ما تونستیم چندین نوع نمایش رو برای ریسایکلرمون تعریف کنیم .

حالا پیشنهاد میکنم متن قبلی رو که در بالا نوشتم هم یک مرور کنین 

موفق باشین:)

const val VIEW_TYPE_ROUND = 0
const val VIEW_TYPE_SMALL = 1
const val VIEW_TYPE_LARGE = 2
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val layoutResId = when (viewType) {
            VIEW_TYPE_ROUND -> R.layout.item_product
            VIEW_TYPE_SMALL -> R.layout.item_product_small
            VIEW_TYPE_LARGE -> R.layout.item_product_large
            else -> throw IllegalStateException("viewType is not valid")
        }
        return ViewHolder(
            LayoutInflater.from(parent.context).***inflate(layoutResId***, parent, false)
        )
    }
فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

18 اسفند 99