【问题标题】:Make Swap Vertical and Horizontal Work With Two Adapters使用两个适配器进行垂直和水平交换
【发布时间】:2018-01-06 20:27:48
【问题描述】:

所以基本上我试图让我的应用程序像 snapchat 一样,您可以在其中向左、向右、向上和向下滑动。我的问题是该应用程序没有意识到有两个适配器并且只能工作一个或一个(垂直或水平)。我如何制作它以便我可以在我的

上垂直和水平滑动

空片段

我目前将 VerticalViewPagerAdapter 扩展到 FragmentPagerAdapter

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

@Override
public Fragment getItem(int position) {
    switch (position){
        case 0:
            return SettingsFragment.create();
        case 1:
            return EmptyFragment.create();
        case 2:
            return ExtrasFragment.create();
    }
    return null;
}

@Override
public int getCount() {
    return 3;
}

还有我的 Horizo​​ntalViewPagerAdapter

public class HorizontalViewPager extends FragmentPagerAdapter {

    public HorizontalViewPager(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0:
                return ChatFragment.create();
            case 1:
                return EmptyFragment.create();
            case 2:
                return StoryFragment.create();
        }
        return null;
    }


@Override
public int getCount() {
    return 3;
}

不知何故,我无法让它们在其中一个或另一个同步,我可以通过更改我的布局文件来改变我的应用程序是垂直还是水平

<View
android:id="@+id/am_background_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/green"/>
<android.support.v4.view.ViewPager
    android:id="@+id/am_view_pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
<me.kaelaela.verticalviewpager.VerticalViewPager
    android:id="@+id/am_scrollView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

我不确定它是否与我的 MainActivity 有关,即

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //VerticalViewPager
    me.kaelaela.verticalviewpager.VerticalViewPager verticalViewPager = findViewById(R.id.am_scrollView);
    VerticalViewPager scrollViewAdapter = new VerticalViewPager(getSupportFragmentManager());
    verticalViewPager.setAdapter(scrollViewAdapter);
    verticalViewPager.setPageTransformer(false, new DefaultTransformer());

    //HorizontalViewPager
    View background = findViewById(R.id.am_background_view);
    ViewPager viewPager = findViewById(R.id.am_view_pager);
    HorizontalViewPager adapter = new HorizontalViewPager(getSupportFragmentManager());
    viewPager.setAdapter(adapter);
    viewPager.setCurrentItem(1);

【问题讨论】:

    标签: android android-fragments android-viewpager adapter


    【解决方案1】:

    here获取基地。

    创建一个GestureDetectorCompat对象

    GestureDetectorCompat gestureDetectorCompat;
    

    并在活动中覆盖 onTouchEvent

     @Override
            public boolean onTouchEvent(MotionEvent event) {
                gestureDetectorCompat.onTouchEvent(event);
                return true;
            }
    

    或者,如果您想在某些视图上进行检测,则可以覆盖 onTouch

    someView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    gestureDetectorCompat.onTouchEvent(motionEvent);
                    return false;
                }
            });
    

    并在 onCreate() 中按如下方式初始化gestureDetectorCompat,然后就完成了。

    gestureDetectorCompat = new GestureDetectorCompat(this, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                float angle = (float) Math.toDegrees(Math.atan2(e1.getY() - e2.getY(), e2.getX() - e1.getX()));
    
                if (angle > -45 && angle <= 45) {
                    if(goRight != 5) mainContainer.setCurrentItem(goRight);
                    return true;
                }
    
                if (angle >= 135 && angle < 180 || angle < -135 && angle > -180) {
                    if(goLeft != 5) mainContainer.setCurrentItem(goLeft);
                    return true;
                }
    
                if (angle < -45 && angle >= -135) {
                    if(goUp != 5)mainContainer.setCurrentItem(goUp);
                    return true;
                }
    
                if (angle > 45 && angle <= 135) {
                    if(goDown != 5)mainContainer.setCurrentItem(goDown);
                    return true;
                }
    
                return false;
            }
    
    
        });
    

    然后你可以使用mainContainer.setCurrentItem(number);去其他位置/片段。

    不要忘记,如果您的号码不同,号码会发生变化。像这样

    switch(adapter.getCurrentItem()){
        case 0:
            goRight = 2;
            goLeft = 4;
            goUp = 3;
            goDown = 1;
            break;
        case 1:
            goRight = 5;
            goLeft = 5;
            goUp = 0;
            goDown = 5;
            break;
        case 2:
            goRight = 5;
            goLeft = 0;
            goUp = 5;
            goDown = 5;
            break;
        case 3:
            goRight = 5;
            goLeft = 5;
            goUp = 5;
            goDown = 0;
            break;
        case 4:
            goRight = 0;
            goLeft = 5;
            goUp = 5;
            goDown = 5;
            break;
    }
    

    当您在片段 4 中时,您只能转到 0,如果左右滑动则不能转到 2。

    这应该是你的适配器

    public class SwipeViewPager extends FragmentPagerAdapter {
    
    public SwipeViewPager(FragmentManager fm) {
        super(fm);
    }
    
    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0:
                return EmptyFragment.create();
            case 1:
                return StoryFragment.create();
            case 2:
                return ExtrasFragment.create();
            case 3:
                return ChatFragment.create();
            case 4:
                return SettingsFragment.create();
        }
        return null;
    }
    
    
    @Override
    public int getCount() {
        return 5;
    }
    

    【讨论】:

    • 只是想知道 DEBUG_TAG 无效我该怎么办?
    • 这只是为了在你的日志中显示你在做什么。您可以将您的字符串放在“用户操作”之类的字符串上,甚至可以删除整行
    • 我也是把这些代码放在mainActivity还是baseFragment中。抱歉有点编码新手
    • 你必须放在这里的是你的容器,可能在 MainActivity 中。 “someView”是您的容器或整个屏幕。
    • 我不知道如何使用容器。
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 2017-07-10
    • 2012-05-09
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多