রিসাইক্লারভিউ অনুভূমিক স্ক্রোল স্ন্যাপ মাঝখানে


89

আমি এখানে পুনর্ব্যবহারযোগ্য ভিউ ব্যবহার করে ক্যারোসেলের মতো দৃশ্য তৈরি করার চেষ্টা করছি, আমি চাই স্ক্রোল করার সময় আইটেমটি একবারে একটি আইটেম স্ক্রিনের মাঝখানে স্ন্যাপ করা হোক। আমি ব্যবহার করার চেষ্টা করেছিrecyclerView.setScrollingTouchSlop(RecyclerView.TOUCH_SLOP_PAGING);

তবে দৃশ্যটি এখনও সহজেই স্ক্রোল করছে, আমি এ জাতীয় স্ক্রোল শ্রোতাদের ব্যবহার করে নিজের যুক্তি প্রয়োগ করার চেষ্টা করেছি:

recyclerView.setOnScrollListener(new OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
                    Log.v("Offset ", recyclerView.getWidth() + "");
                    if (newState == 0) {
                        try {
                               recyclerView.smoothScrollToPosition(layoutManager.findLastVisibleItemPosition());
                                recyclerView.scrollBy(20,0);
                            if (layoutManager.findLastVisibleItemPosition() >= recyclerView.getAdapter().getItemCount() - 1) {
                                Beam refresh = new Beam();
                                refresh.execute(createUrl());
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

ডান থেকে বাম সোয়াইপ এখন ঠিকঠাক কাজ করছে, তবে অন্যভাবে নয়, আমি এখানে কী মিস করছি?

উত্তর:


164

সহ LinearSnapHelper, এটি এখন খুব সহজ।

আপনাকে যা করতে হবে তা হ'ল:

SnapHelper helper = new LinearSnapHelper();
helper.attachToRecyclerView(recyclerView);

হালনাগাদ

25.1.0 থেকে উপলব্ধ, এর মতো প্রভাব PagerSnapHelperঅর্জনে সহায়তা করতে পারে ViewPager। আপনি এটি ব্যবহার হিসাবে এটি ব্যবহার করুন LinearSnapHelper

পুরাতন কাজ:

আপনি যদি এটির মতো আচরণ করতে চান তবে ViewPagerপরিবর্তে এটি ব্যবহার করে দেখুন:

LinearSnapHelper snapHelper = new LinearSnapHelper() {
    @Override
    public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) {
        View centerView = findSnapView(layoutManager);
        if (centerView == null) 
            return RecyclerView.NO_POSITION;

        int position = layoutManager.getPosition(centerView);
        int targetPosition = -1;
        if (layoutManager.canScrollHorizontally()) {
            if (velocityX < 0) {
                targetPosition = position - 1;
            } else {
                targetPosition = position + 1;
            }
        }

        if (layoutManager.canScrollVertically()) {
            if (velocityY < 0) {
                targetPosition = position - 1;
            } else {
                targetPosition = position + 1;
            }
        }

        final int firstItem = 0;
        final int lastItem = layoutManager.getItemCount() - 1;
        targetPosition = Math.min(lastItem, Math.max(targetPosition, firstItem));
        return targetPosition;
    }
};
snapHelper.attachToRecyclerView(recyclerView);

উপরের প্রয়োগটি কেবল মাত্রার প্রবণতা নির্বিশেষে বেগের দিকের ভিত্তিতে বর্তমান আইটেমের (কেন্দ্রিক) পাশের অবস্থানটি ফিরিয়ে দেয়।

পূর্ববর্তীটি হ'ল প্রথম পক্ষের সমাধান যা সমর্থন লাইব্রেরি সংস্করণ 24.2.0 এ অন্তর্ভুক্ত। মানে আপনাকে এটি আপনার অ্যাপ্লিকেশন মডিউলে যুক্ত করতে build.gradleহবে বা আপডেট করতে হবে।

compile "com.android.support:recyclerview-v7:24.2.0"

এটি আমার পক্ষে কার্যকর হয়নি (তবে @ অ্যালবার্ট ভিলা ক্যালভোর সমাধানটি করেছেন)। আপনি কি তা বাস্তবায়ন করেছেন? আমাদের কি এটি থেকে পদ্ধতিগুলি ওভাররাইড করার কথা? আমি মনে করব যে ক্লাসটি বাক্সের বাইরে সমস্ত কাজ করা উচিত
গ্যালাক্সিগর্ল

হ্যাঁ, তাই উত্তর। আমি তবে ভাল পরীক্ষা করিনি। স্পষ্টতই, আমি এটি এমন একটি অনুভূমিক দিয়ে করেছি LinearLayoutManagerযেখানে সমস্ত মতামতই আকারে নিয়মিত ছিল। উপরের স্নিপেট ছাড়া আর কিছুই দরকার নেই।
razzledazzle

@ গ্যালাক্সিগর্ল ক্ষমা চেয়েছি, আপনি কী বোঝাতে চেয়েছিলেন তা আমি বুঝতে পেরেছি এবং এটি স্বীকার করে কিছু সম্পাদনা করেছি, দয়া করে মন্তব্য করুন do এটি এর সাথে একটি বিকল্প সমাধান LinearSnapHelper
razzledazzle

এটি আমার জন্য ঠিক কাজ করেছে। @ গ্যালাক্সিগর্ল এই পদ্ধতিটিকে ওভাররাইড করে সাহায্য করে যে রৈখিক স্ন্যাপ সহায়ক অন্যথায় নিকটবর্তী আইটেমটিতে স্ন্যাপ করবে যখন স্ক্রোল স্থির হয় ঠিক ঠিক পরবর্তী / পূর্ববর্তী আইটেমটি নয়। এর জন্য আপনাকে অনেক ধন্যবাদ, razzledazzle
এএএপিভি

লিনিয়ারস্প্ল্প হ'ল প্রাথমিক সমাধান যা আমার পক্ষে কাজ করেছিল, তবে মনে হয় পেজারস্নাপহেল্পার সুইপিংকে আরও ভাল অ্যানিমেশন দিয়েছিলেন।
লিওনার্দো

77

গুগল আই / ও 2019 আপডেট

ভিউপ্যাজার 2 এখানে!

গুগল সবেমাত্র 'অ্যান্ড্রয়েডে নতুন কী' (আলাপ 'অ্যান্ড্রয়েড মূল বক্তব্য)' টকটিতে ঘোষণা করেছিল যে তারা রিসাইক্লারভিউয়ের উপর ভিত্তি করে একটি নতুন ভিউপ্যাজারে কাজ করছে!

স্লাইডগুলি থেকে:

ভিউপ্যাজারের মতো, তবে আরও ভাল

  • ভিউপ্যাজার থেকে সহজ স্থানান্তর
  • পুনর্ব্যবহারযোগ্য ভিউয়ের উপর ভিত্তি করে
  • ডান থেকে বাম মোড সমর্থন
  • উল্লম্ব পেজিংয়ের অনুমতি দেয়
  • উন্নত ডেটাसेट পরিবর্তন বিজ্ঞপ্তি

আপনি এখানে সর্বশেষতম সংস্করণ এবং রিলিজ নোটগুলি এখানে পরীক্ষা করতে পারেন । এছাড়া একটি হল সরকারী নমুনা

ব্যক্তিগত মতামত: আমি মনে করি এটি সত্যিই প্রয়োজনীয় সংযোজন। আমি PagerSnapHelper অনির্দিষ্টকালের জন্য ডানদিকে বামনদীকরণের সাথে সম্প্রতি অনেক সমস্যায় পড়েছি - আমি টিকিটটি খুলেছি তা দেখুন।


নতুন উত্তর (২০১))

আপনি এখন স্ন্যাপহেল্পার ব্যবহার করতে পারেন ।

আপনি যদি একটি কেন্দ্র-প্রান্তিককৃত বিচ্ছিন্ন আচরণ অনুরূপ চান ViewPager তারপর ব্যবহার PagerSnapHelper :

SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);

একটি লিনিয়ারস্নাপহেল্পারও রয়েছে । আমি এটি চেষ্টা করেছি এবং যদি আপনি শক্তির সাথে ঝাপটান হন তবে এটি 1 টি ঝাঁকুনির সাহায্যে 2 টি আইটেম স্ক্রল করে। ব্যক্তিগতভাবে আমি এটি পছন্দ করি নি, তবে কেবল নিজের দ্বারা সিদ্ধান্ত নিন - এটি চেষ্টা করতে কয়েক সেকেন্ড সময় লাগে।


আসল উত্তর (২০১))

বহু ঘন্টা চেষ্টা করার পরেও এখানে 3 টি বিভিন্ন সমাধান পাওয়া গেছে আমি অবশেষে একটি সমাধান তৈরি করেছি যা এ এর ​​মধ্যে প্রাপ্ত আচরণের খুব কাছাকাছি নকল করে ViewPager

সমাধানটি @EDizzle সমাধানের উপর ভিত্তি করে তৈরি করা হয়েছে , যা আমি বিশ্বাস করি যে আমি এটির মতো প্রায় কাজ করে বলার জন্য যথেষ্ট উন্নতি করেছি ViewPager

গুরুত্বপূর্ণ: আমার RecyclerViewআইটেমগুলির প্রস্থটি স্ক্রিনের মতোই। আমি অন্য আকারের সাথে চেষ্টা করিনি। এছাড়াও আমি এটি একটি অনুভূমিক সহ ব্যবহার করি LinearLayoutManager। আমি মনে করি আপনি উল্লম্ব স্ক্রোল চাইলে আপনার কোডটি মানিয়ে নিতে হবে।

এখানে আপনার কোডটি রয়েছে:

public class SnappyRecyclerView extends RecyclerView {

    // Use it with a horizontal LinearLayoutManager
    // Based on https://stackoverflow.com/a/29171652/4034572

    public SnappyRecyclerView(Context context) {
        super(context);
    }

    public SnappyRecyclerView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public SnappyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean fling(int velocityX, int velocityY) {

        LinearLayoutManager linearLayoutManager = (LinearLayoutManager) getLayoutManager();

        int screenWidth = Resources.getSystem().getDisplayMetrics().widthPixels;

        // views on the screen
        int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
        View lastView = linearLayoutManager.findViewByPosition(lastVisibleItemPosition);
        int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
        View firstView = linearLayoutManager.findViewByPosition(firstVisibleItemPosition);

        // distance we need to scroll
        int leftMargin = (screenWidth - lastView.getWidth()) / 2;
        int rightMargin = (screenWidth - firstView.getWidth()) / 2 + firstView.getWidth();
        int leftEdge = lastView.getLeft();
        int rightEdge = firstView.getRight();
        int scrollDistanceLeft = leftEdge - leftMargin;
        int scrollDistanceRight = rightMargin - rightEdge;

        if (Math.abs(velocityX) < 1000) {
            // The fling is slow -> stay at the current page if we are less than half through,
            // or go to the next page if more than half through

            if (leftEdge > screenWidth / 2) {
                // go to next page
                smoothScrollBy(-scrollDistanceRight, 0);
            } else if (rightEdge < screenWidth / 2) {
                // go to next page
                smoothScrollBy(scrollDistanceLeft, 0);
            } else {
                // stay at current page
                if (velocityX > 0) {
                    smoothScrollBy(-scrollDistanceRight, 0);
                } else {
                    smoothScrollBy(scrollDistanceLeft, 0);
                }
            }
            return true;

        } else {
            // The fling is fast -> go to next page

            if (velocityX > 0) {
                smoothScrollBy(scrollDistanceLeft, 0);
            } else {
                smoothScrollBy(-scrollDistanceRight, 0);
            }
            return true;

        }

    }

    @Override
    public void onScrollStateChanged(int state) {
        super.onScrollStateChanged(state);

        // If you tap on the phone while the RecyclerView is scrolling it will stop in the middle.
        // This code fixes this. This code is not strictly necessary but it improves the behaviour.

        if (state == SCROLL_STATE_IDLE) {
            LinearLayoutManager linearLayoutManager = (LinearLayoutManager) getLayoutManager();

            int screenWidth = Resources.getSystem().getDisplayMetrics().widthPixels;

            // views on the screen
            int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();
            View lastView = linearLayoutManager.findViewByPosition(lastVisibleItemPosition);
            int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
            View firstView = linearLayoutManager.findViewByPosition(firstVisibleItemPosition);

            // distance we need to scroll
            int leftMargin = (screenWidth - lastView.getWidth()) / 2;
            int rightMargin = (screenWidth - firstView.getWidth()) / 2 + firstView.getWidth();
            int leftEdge = lastView.getLeft();
            int rightEdge = firstView.getRight();
            int scrollDistanceLeft = leftEdge - leftMargin;
            int scrollDistanceRight = rightMargin - rightEdge;

            if (leftEdge > screenWidth / 2) {
                smoothScrollBy(-scrollDistanceRight, 0);
            } else if (rightEdge < screenWidth / 2) {
                smoothScrollBy(scrollDistanceLeft, 0);
            }
        }
    }

}

উপভোগ করুন!


OncrolStateChanged () ভাল লাগছে; অন্যথায়, যদি আমরা ধীরে ধীরে রিসাইক্লারভিউটি সোয়াইপ করি তবে একটি ছোট বাগ উপস্থিত রয়েছে। ধন্যবাদ!
মরিসিও সার্টোরি

মার্জিনগুলিকে সমর্থন করার জন্য (অ্যান্ড্রয়েড: লেআউট_মার্জিনস্টার্ট = "16 ডিপি") আমি স্ক্রিনউইথ = getWidth () দিয়ে চেষ্টা করেছি; এবং এটা কাজ মনে হয়.
eigil


4
@galaxigirl না, আমি এখনও লিনিয়ারস্নাপহেল্পার চেষ্টা করি নি। আমি কেবল উত্তরটি আপডেট করেছি যাতে লোকেরা সরকারী সমাধান সম্পর্কে জানে। আমার সমাধানটি আমার অ্যাপটিতে কোনও সমস্যা ছাড়াই কাজ করে।
আলবার্ট ভিলা ক্যালভো

4
অ্যালবার্টভিলা কলভো আমি লিনিয়ারস্নাপহেল্পার চেষ্টা করেছিলাম। লিনিয়ারস্নাপহেল্পার একটি স্ক্রোলারের সাথে কাজ করে। এটি মাধ্যাকর্ষণ এবং উড়ানের বেগের উপর ভিত্তি করে স্ক্রল করে এবং স্ন্যাপগুলি। আরও বেশি পৃষ্ঠাগুলি স্ক্রোল করা হয়। আমি আচরণের মতো ভিউপ্যাজারের জন্য এটির প্রস্তাব দেব না।
mipreamble

47

লক্ষ্যটি যদি RecyclerViewনকল করা হয় তবে সেটির আচরণটি ViewPagerবেশ সহজ পদ্ধতির হয়

RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);

LinearLayoutManager layoutManager = new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false);
SnapHelper snapHelper = new PagerSnapHelper();
recyclerView.setLayoutManager(layoutManager);
snapHelper.attachToRecyclerView(mRecyclerView);

ব্যবহার করে PagerSnapHelperআপনি যেমন আচরণ পেতে পারেনViewPager


4
আমি এর LinearSnapHelperপরিবর্তে ব্যবহার করছি PagerSnapHelper এবং এটি আমার জন্য কাজ করে
fanjavaid

4
হ্যাঁ, এতে কোনও স্ন্যাপের প্রভাব নেইLinearSnapHelper
বুুনিয়া কিটপিটাক

4
এই দৃশ্যে আইটেমটি আটকে দেয় স্ক্রোলযোগ্য
স্যাম

বুন্যকিটপিটাক, আমি চেষ্টা করেছিলাম LinearSnapHelperএবং এটি একটি মাঝারি আইটেমটির কাছে যায়। PagerSnapHelperসহজে স্ক্রোল করতে বাধা দেয় (কমপক্ষে চিত্রগুলির একটি তালিকা)।
শীতলমাইন্ড

@ বুনিয়াকিটপিটাক আপনি কীভাবে আমাকে এটি করতে পারবেন তা বলতে পারবেন, কেন্দ্রে একটি আইটেম পুরোপুরি দৃশ্যমান এবং পাশের আইটেমগুলি অর্ধ দৃশ্যমান?
রুচা ভট্ট জোশী

30

বিপরীত দিকে যাওয়ার জন্য আপনাকে ফাইন্ডভিস্টিবিলিটি আইটেম পজিশন ব্যবহার করতে হবে। এবং সোয়াইপটি কোন দিকে ছিল তা সনাক্ত করার জন্য, আপনাকে ফলিং বেগ বা এক্স পরিবর্তন করতে হবে। আপনার চেয়ে কিছুটা আলাদা কোণ থেকে আমি এই সমস্যাটির কাছে এসেছি।

একটি নতুন শ্রেণি তৈরি করুন যা পুনর্ব্যবহারযোগ্য শ্রেণীর বর্ধন করে এবং তারপরে পুনর্ব্যবহারযোগ্য ভিউয়ের ঝাঁকুনির পদ্ধতিটিকে ওভাররাইড করে:

@Override
public boolean fling(int velocityX, int velocityY) {
    LinearLayoutManager linearLayoutManager = (LinearLayoutManager) getLayoutManager();

//these four variables identify the views you see on screen.
    int lastVisibleView = linearLayoutManager.findLastVisibleItemPosition();
    int firstVisibleView = linearLayoutManager.findFirstVisibleItemPosition();
    View firstView = linearLayoutManager.findViewByPosition(firstVisibleView);
    View lastView = linearLayoutManager.findViewByPosition(lastVisibleView);

//these variables get the distance you need to scroll in order to center your views.
//my views have variable sizes, so I need to calculate side margins separately.     
//note the subtle difference in how right and left margins are calculated, as well as
//the resulting scroll distances.
    int leftMargin = (screenWidth - lastView.getWidth()) / 2;
    int rightMargin = (screenWidth - firstView.getWidth()) / 2 + firstView.getWidth();
    int leftEdge = lastView.getLeft();
    int rightEdge = firstView.getRight();
    int scrollDistanceLeft = leftEdge - leftMargin;
    int scrollDistanceRight = rightMargin - rightEdge;

//if(user swipes to the left) 
    if(velocityX > 0) smoothScrollBy(scrollDistanceLeft, 0);
    else smoothScrollBy(-scrollDistanceRight, 0);

    return true;
}

স্ক্রিনউইথ কোথায় সংজ্ঞায়িত করা হয়?
ltsai

@ ইতসাই: ওফ! ভাল প্রশ্ন. এটি ক্লাসের অন্যত্র আমি সেট করেছিলাম set এটি ডিভাইসের স্ক্রিনের প্রস্থ পিক্সেল নয়, ঘনত্বের পিক্সেলের নয়, যেহেতু স্মুথস্ক্রোলবি পদ্ধতিতে আপনি যে পিক্সেলটি দ্বারা স্ক্রোল করতে চান তার প্রয়োজন হয়।
eDizzle

4
@ এলটসই আপনি স্ক্রিনউইথের পরিবর্তে getWidth () (recyclerview.getWidth ()) এ পরিবর্তন করতে পারেন। যখন রিসাইক্লার ভিউ স্ক্রিনের প্রস্থের চেয়ে ছোট হয় তখন স্ক্রিনউইথ সঠিকভাবে কাজ করে না।
VAdaihiep

আমি পুনর্ব্যবহারযোগ্য সম্প্রসারিত করার চেষ্টা করেছি কিন্তু আমি "ক্লাস কাস্টম রিসাইক্লারভিউ স্ফীতকরণে ত্রুটি" পেয়েছি। তুমি কি সাহায্য করতে পারো? ধন্যবাদ

@bttyBarnes: আপনি অন্য একটি প্রশ্ন ফিডে এটির জন্য অনুসন্ধান করতে পারেন। এখানে প্রাথমিক প্রশ্নটি বেশ সুযোগের বাইরে।
ইডিজল

6

শুধু যোগ paddingএবং marginকরতে recyclerViewএবং recyclerView item:

পুনর্ব্যবহারযোগ্য আইটেম:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parentLayout"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_marginLeft="8dp" <!-- here -->
    android:layout_marginRight="8dp" <!-- here  -->
    android:layout_width="match_parent"
    android:layout_height="200dp">

   <!-- child views -->

</RelativeLayout>

রিসাইক্লারভিউ:

<androidx.recyclerview.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="8dp" <!-- here -->
    android:paddingRight="8dp" <!-- here -->
    android:clipToPadding="false" <!-- important!-->
    android:scrollbars="none" />

এবং সেট PagerSnapHelper:

int displayWidth = Resources.getSystem().getDisplayMetrics().widthPixels;
parentLayout.getLayoutParams().width = displayWidth - Utils.dpToPx(16) * 4;
SnapHelper snapHelper = new PagerSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);

পিপিএক্স থেকে ডিপি:

public static int dpToPx(int dp) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, Resources.getSystem().getDisplayMetrics());
}

ফলাফল:

এখানে চিত্র বর্ণনা লিখুন


আইটেমগুলির মধ্যে ভেরিয়েবল প্যাডিং অর্জনের কোনও উপায় আছে কি? প্রথম এবং শেষ কার্ডটি যদি মধ্যবর্তী কার্ডগুলি কেন্দ্র করে পরের / পূর্ববর্তী কার্ডগুলি আরও দেখানোর জন্য কেন্দ্রীভূত করা দরকার না?
রামপ্রসাদবিসিল

2

আমার সমাধান:

/**
 * Horizontal linear layout manager whose smoothScrollToPosition() centers
 * on the target item
 */
class ItemLayoutManager extends LinearLayoutManager {

    private int centeredItemOffset;

    public ItemLayoutManager(Context context) {
        super(context, LinearLayoutManager.HORIZONTAL, false);
    }

    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
        LinearSmoothScroller linearSmoothScroller = new Scroller(recyclerView.getContext());
        linearSmoothScroller.setTargetPosition(position);
        startSmoothScroll(linearSmoothScroller);
    }

    public void setCenteredItemOffset(int centeredItemOffset) {
        this.centeredItemOffset = centeredItemOffset;
    }

    /**
     * ********** Inner Classes **********
     */

    private class Scroller extends LinearSmoothScroller {

        public Scroller(Context context) {
            super(context);
        }

        @Override
        public PointF computeScrollVectorForPosition(int targetPosition) {
            return ItemLayoutManager.this.computeScrollVectorForPosition(targetPosition);
        }

        @Override
        public int calculateDxToMakeVisible(View view, int snapPreference) {
            return super.calculateDxToMakeVisible(view, SNAP_TO_START) + centeredItemOffset;
        }
    }
}

আমি এই লেআউট ম্যানেজারটিকে পুনর্ব্যবহারযোগ্য ভিউতে পাস করি এবং আইটেমগুলি কেন্দ্রের জন্য প্রয়োজনীয় অফসেট সেট করি। আমার সমস্ত আইটেমের একই প্রস্থ রয়েছে তাই ধ্রুবক অফসেটটি ঠিক আছে


0

PagerSnapHelperGridLayoutManagerস্প্যানকাউন্ট> 1 দিয়ে কাজ করে না , সুতরাং এই পরিস্থিতিতে আমার সমাধানটি হ'ল:

class GridPagerSnapHelper : PagerSnapHelper() {
    override fun findTargetSnapPosition(layoutManager: RecyclerView.LayoutManager?, velocityX: Int, velocityY: Int): Int {
        val forwardDirection = if (layoutManager?.canScrollHorizontally() == true) {
            velocityX > 0
        } else {
            velocityY > 0
        }
        val centerPosition = super.findTargetSnapPosition(layoutManager, velocityX, velocityY)
        return centerPosition +
            if (forwardDirection) (layoutManager as GridLayoutManager).spanCount - 1 else 0
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.