【问题标题】:Layout scrolling up when view pager moves to new page当视图寻呼机移动到新页面时布局向上滚动
【发布时间】:2016-11-15 17:36:39
【问题描述】:

我有一个布局,其中包含一个 viewpager(在布局顶部)和一个 listview(在寻呼机下方),并且我使用 Runnable 类每 3 秒移动一次新页面,问题是每当寻呼机移动到 newpage 布局向上滚动,以便我可以看到寻呼机。我想防止向上滚动并在任何地方保持位置。

pageAdapter = new PagerAdapterCustom(getSupportFragmentManager(),
                getApplicationContext(), pics, true, false);
        pager.setAdapter(pageAdapter);
        mIndicator = (CirclePageIndicator) findViewById(R.id.indicatorDetailsNews);

        mIndicator.setViewPager(pager);
        pager.setOnPageChangeListener(new OnPageChangeListener() {

            @Override
            public void onPageSelected(int arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub
                currentPage = arg0;
                //mIndicator.setCurrentItem(arg0);
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub
                //mIndicator.setCurrentItem(arg0);
            }
        });

        final Handler handler = new Handler();

        final Runnable Update = new Runnable() {

            public void run() {
                if (currentPage == NUM_PAGES - 1) {
                    currentPage = -1;
                }
                pager.setCurrentItem(currentPage++, true);
                mIndicator.setCurrentItem(currentPage++);
                pager.setScrollBarFadeDuration(R.styleable.CirclePageIndicator_fillColor);
                // pager.setScrollDurationFactor(4);
            }
        };

        swipeTimer = new Timer();
        swipeTimer.schedule(new TimerTask() {

            @Override
            public void run() {
                handler.post(Update);
            }
        }, 1000, 3000);

【问题讨论】:

    标签: android listview android-viewpager


    【解决方案1】:

    Knossos 的答案是方法,你应该从你的容器 Activity 中管理这个,

    假设您正在使用 RecyclerView,每当您检测到您的 RecyclerView 滚动时,警告您的 Activity,您可以执行以下操作:

    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
    
                scrolledValue = dy;
    
            }
        });
    

    并将scrolledValue 发送回ContainerActivity。 ContanierActivity 然后将通知所有其他 Fragment 有关更改并通过 scrolledValue 滚动它们的 RecyclerViews,无论它是正值还是负值。

    为此,我认为您可以使用 smoothScrollBy(int dx, int dy),但我还没有尝试过。见documentation

    【讨论】:

      【解决方案2】:

      问题是PagerAdapterCustom 中的Fragment 不知道其兄弟Fragments 的滚动状态。

      所以当你滚动一个时,其他的当然仍然在顶部。

      要解决此问题,您需要做两件事。

      1. 当检测到在 Fragment 内滚动时,您会将滚动报告给 PagerAdapterCustom 的所有者。
      2. 当您切换到新的Fragment 时,会将当前的滚动状态报告给新的Fragment

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多