حرکت Swipe روان در RecyclingView های متقاطع

شنبه ۲۹ دی ۹۷ توسط سالار ساری نوایی

حرکت جاروبی (Swipe) روان در RecyclingView های متقاطع

شاید تا به حال متوجه نشده باشید که برنامه‌ی Google Playstore یک RecyclerView عمودی است که در خود چندین RecyclerView افقی دارد (یا چیزی شبیه به آن).

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

اما چیزی که من تجربه می‌کنم این گونه نیست...

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

مسئله‌ی مهمی نیست، اما از دیدگاهی کاربرپسندانه، چنین ویژگی‌های کوچکی می‌توانند تغییرات بزرگی ایجاد کنند.

خب، چطور باید آن را رفع کنیم؟

راه حل

در ابتدا به کنترل اتفاقات لمسی توسط خودم فکر می‌کردم که با استفاده از RecyclerView های سفارشی، تابع onInterceptTouchEvent را override کنم.

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

استفاده از addOnItemTouchListener

اما در ادامه به این موضوع پی‌بردم که در RecyclerView متدی اضافه شده که می‌تواند رفتار لمسی پیاده‌سازی شده در RecyclerView را با استفاده از addOnItemTouchListener تصرف کند.

به طور خلاصه، کد پایین را در RecyclerView اضافه کنید تا امکان حرکت جاروبی برای RecyclerView های افقی و عمودی امکان‌پذیر باشد.

recycler_view.addOnItemTouchListener(
  object: RecyclerView.OnItemTouchListener {
    override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {}
    override fun onInterceptTouchEvent(rv: RecyclerView, e: 
            MotionEvent): Boolean {
        if (e.action == MotionEvent.ACTION_DOWN &&
            rv.scrollState == RecyclerView.SCROLL_STATE_SETTLING) {
            rv.stopScroll()
        }
        return false
    }
    override fun onRequestDisallowInterceptTouchEvent(
        disallowIntercept: Boolean) {}
})

نتیجه آن مانند شکل پایین خواهد بود، با تنها یک لمس روی RecyclerView افقی، قادر خواهید بود که بدون نیاز به لمس مجدد آن را اسکرول کنید.

این راه حل باید به این پست نسبت داده شود.

برای دریافت کد به این لینک مراجعه کنید.

امیدوارم که این پست برای شما مفید بوده باشد.


کلیدواژه: اندروید Android RecyclerView Scroll

منابع: medium.com

ارسال دیدگاه:
برای ارسال دیگاه باید به سیستم وارد شوید و یا ثبت نام کنید. ثبت نام چند لحظه بیشتر زمان شما را نمیگیرد.
مولف:
سالار ساری نوایی
عضو تیم تولید محتوای آرکادمی
مشاهده‌ی پروفایل
آمار و مشخصات:
event
دوشنبه ۱۷ دی ۹۷
public
arcademy.ir/+a353
favorite
۳ پسند
comment
۰ دیدگاه
group
۲۹۷ بازدیدکننده
visibility
۳۶۵ بازدید
رده های این مقاله: