9

私が欲しいもの:

私はAndroidに2方向のエンドレスビューページャー、左から右右から左を実装しようとしています

私がしたこと:

Endless viewpager adapterを実装しました。右から左の方向で正常に動作し、現在のアイテムの位置を で設定しましたviewPager.setCurrentItem(Integer.MAX_VALUE/2);

参照:

ここに画像の説明を入力

助けていただければ幸いです。

4

4 に答える 4

10

FragmentPagerAdapterエンドレス ビューページャー アダプターを取得するには、以下を確認してください。

public static class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public int getCount() {
    return Integer.MAX_VALUE;
}

@Override
public Fragment getItem(int position) {
    return getFragmentBasedOnPosition(position);
}

private Fragment getFragmentBasedOnPosition(int position) {
    int fragmentPos = position % 3; // Assuming you have 3 fragments
    switch(fragmentPos) {
        case 0:
        return Fragment1.newInstance();
        case 1:
        return Fragment2.newInstance();
        case 2:
        return Fragment3.newInstance();
    }
 }
}

ここで解決策を見つけました。

お役に立てば幸いです。

于 2016-04-03T11:56:28.200 に答える
2

これを実現する簡単な方法の 1 つViewPager2は、次の 3 つの基本的なアイデアを使用することです。

  1. データ モデル コレクションの最初と最後のアイテムを、同じコレクションの最後と最初にそれぞれ追加します。たとえばlistOf(1, 2, 3, 4, 5)、になる必要がありlistOf(5, 1, 2, 3, 4, 5, 1)ます。
  2. ページャーを設定するときは、インデックス 1 から開始するように設定してください。
  3. ユーザーがインデックス 0 までスクロールすると、ページャーはすぐに最後から 2 番目のインデックスまでスクロールします。ユーザーが最後のインデックスまでスクロールすると、ページャーはすぐにインデックス 1 にスクロールします。

これを行うためのサンプル コードは次のとおりです。

1.

private fun <T> List<T>.prepareForTwoWayPaging(): List<T> {
    val first = first()
    val last = last()
    return toMutableList().apply {
        add(0, last)
        add(first)
    }
}
pager.setCurrentItem(1, false)
pager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
    override fun onPageScrolled(
        position: Int,
        positionOffset: Float,
        positionOffsetPixels: Int
    ) {
        // We're only interested when the pager offset is exactly centered. This
        // will help create a convincing illusion of two-way paging.
        if (positionOffsetPixels != 0) {
            return
        }
        when (position) {
            0 -> pager.setCurrentItem(adapter.itemCount - 2, false)
            adapter.itemCount - 1 -> pager.setCurrentItem(1, false)
        }
    }
})

TabLayout警告: このコードは、データ モデル コレクションのいずれかまたは空のデータを調整しません。

于 2021-03-15T00:55:08.520 に答える