web-dev-qa-db-ja.com

一度に1つのアイテムをスワイプします

リサイクラービューのスクロールリスナーを追加していくつかのロジックを作成しようとしましたが、一度に1つのアイテムをスワイプすることはできません。インターネットで検索しましたが、カスタムリサイクラービューを持つサードパーティのライブラリがありました。リサイクラビューで一度に1つのアイテムスワイプを実装できますか?はいの場合、どのように教えてください?このように一度に1つの項目をスワイプします image

24

これは遅い、i know

カスタムSnapHelperを使用して、要求されたスクロール動作を正確に取得する非常にシンプルの方法があります。

標準のSnapHelper(Android.support.v7.widget.LinearSnapHelper)を上書きして、独自のSnapHelperを作成します。

public class SnapHelperOneByOne extends LinearSnapHelper{

    @Override
    public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY){

        if (!(layoutManager instanceof RecyclerView.SmoothScroller.ScrollVectorProvider)) {
            return RecyclerView.NO_POSITION;
        }

        final View currentView = findSnapView(layoutManager);

        if( currentView == null ){
            return RecyclerView.NO_POSITION;
        }

        final int currentPosition = layoutManager.getPosition(currentView);

        if (currentPosition == RecyclerView.NO_POSITION) {
            return RecyclerView.NO_POSITION;
        }

        return currentPosition;
    }
}

これは基本的に標準的な方法ですが、スクロール速度によって計算されるジャンプカウンターを追加しません。

高速で長くスワイプすると、次の(または前の)ビューが中央に表示されます(表示)。

ゆっくりと短くスワイプすると、現在の中央のビューはリリース後も中央にとどまります。

この答えが誰にも役立つことを願っています。

21
Palm

これにより、アイテム間の動きが柔らかくなります。

public class SnapHelperOneByOne extends LinearSnapHelper {

    @Override
    public int findTargetSnapPosition(RecyclerView.LayoutManager layoutManager, int velocityX, int velocityY) {

        if (!(layoutManager instanceof RecyclerView.SmoothScroller.ScrollVectorProvider)) {
            return RecyclerView.NO_POSITION;
        }

        final View currentView = findSnapView(layoutManager);

        if (currentView == null) {
            return RecyclerView.NO_POSITION;
        }

        LinearLayoutManager myLayoutManager = (LinearLayoutManager) layoutManager;

        int position1 = myLayoutManager.findFirstVisibleItemPosition();
        int position2 = myLayoutManager.findLastVisibleItemPosition();

        int currentPosition = layoutManager.getPosition(currentView);

        if (velocityX > 400) {
            currentPosition = position2;
        } else if (velocityX < 400) {
            currentPosition = position1;
        }

        if (currentPosition == RecyclerView.NO_POSITION) {
            return RecyclerView.NO_POSITION;
        }

        return currentPosition;
    }
}

例:

LinearSnapHelper linearSnapHelper = new SnapHelperOneByOne();
linearSnapHelper.attachToRecyclerView(recyclerView);
7
Vladimir Escoto

https://github.com/googlesamples/Android-Horizo​​ntalPaging/

これには、画像に示したものと同様のものへのリンクがあります。他に探しているものがあるかどうかをお知らせください。関連するライブラリをリンクします。

基本的に、ViewPagerとrecyclerViewの違いは、recyclerViewでは多くのアイテムを切り替えるのに対して、ViewPagerでは多くのフラグメントまたは独立したページ自体を切り替えるということです。

あなたはこれを使用していることがわかります https://github.com/lsjwzh/RecyclerViewPager 、あなたが念頭に置いている特定のユースケースはありますか?

2
Varun Agarwal