1

这是我在这里的第一篇文章,也是我第一次尝试用英语解释一个编码问题。所以请在阅读本文时保持温和:)。

我有两个关于 ViewPager 的问题。

第一的:

如果我将片段列表传递给 PagerAdapter,它将显示列表中的第一个片段。是否可以修改它以便能够首先显示列表中的第二个、第三个...片段?因为方法 setCurrentItem(page) 将在 PagerAdapter 显示第一个片段之后显示页面。

第二:

我试图在动态 ViewChange 之间实现暂停,如下所示:

// pass the Fragments to pagerAdapter here which will show the first fragment

// loop for the other Fragments
handler.postDelayed(new Runnable(){
    public void run(){
       for(int i = 0; i < list.size(); i++){
            ViewPager.setCurrentItem(list.indexOf(i), true);
            // Set Pause here
       }
    }
}, 500);

注释“在此处设置暂停”标记了我仍在尝试在分页之间暂停的位置。但我不知道如何解决这个问题。因为 Thread.sleep 在这里不是真正的交易。

这个想法是用 PageAdapter 显示第一个 Fragment。然后我使用 handler.postDelayed 来延迟第二个页面滑动。在此,我以恒定的延迟循环浏览所有页面。

如果有人可以帮助我找到解决方案,我会非常高兴。

4

2 回答 2

2

对于您的第一个问题,您在打电话setCurrentItem(int, false)吗?如果您只调用 setCurrentItem(int),如果 ViewPager 已经通过其当前适配器的第一个布局,它将为过渡设置动画。如果这不是一个解决方案,可以考虑在你的布局文件中初始化ViewPagerwith visibility = "invisible"(或者setVisibility(View.INVISIBLE)在将片段列表传递给之前调用PagerAdapter。)然后,在你调用之后setCurrentItem,你可以使用setVisibility(View.VISIBLE). 我认为在 onCreate 和调用中设置 ViewPagersetCurrentItem(int, false)应该可以防止出现任何动画,但我现在没有时间进行测试。

对于第二个问题,我认为让您感到困惑的部分是该run方法将在运行时阻塞整个 UI 线程,这意味着当您循环遍历项目时 UI 将无法自行更新在ViewPager.

本质上,您正在调用Thread.sleep()UI 线程。这可能并不完全清楚,因为它在 Runnable 的 run 方法中,除非您意识到您已经发布了一条消息以在 Handler 的线程上运行,如果您使用默认 Handler 在 Activity 生命周期方法中创建它,它将是 UI 线程( ) 构造函数。相反,您希望您发布的 Runnable 在下次您想要更改 ViewPager 中的当前项目时延迟发布一条新消息。

我会做的是类似以下的事情(警告 - 我没有测试过这个):

添加方法以连续循环的子类Handler(我假设您将其作为包含 ViewPager 的 Activity 上的内部类来执行此操作,因此您可以访问包含 ViewPager 的成员变量。我在代码中调用该成员变量 mPager以下):

private Runnable mLoopingRunnable = new Runnable(){
    public void run() {
        int currentItem = mPager.getCurrentItem();
        int totalItems = mPager.getAdapter().getCount();
        int nextItem = (currentItem + 1) % totalItems;
        mPager.setCurrentItem(nextItem, true);
                handler.postDelayed(self, 500);
            }
        };

handler.postDelayed(mLoopingRunnable, 500);

如果/当您想停止循环时(请注意,如果您想在某个时候取消它,您需要保留 Runnable 的句柄):

handler.removeCallbacks(mLoopingRunnable);

请注意,setCurrentItem如上所述更改调用的一个优点是它不会干扰用户滑动 ViewPager 以从一个视图移动到下一个视图。如果您只是像在循环中那样将 currentItem 设置为某个整数,那么当用户与寻呼机交互时,该行为会显得有些奇怪。

我猜想有一些东西可以自动处理类似于 ViewFlipper 的循环,但粗略地看一下 ViewPager API 并不太明显。

于 2012-07-09T15:43:26.590 回答
0

您不应该通过睡眠来停止UI 线程,因为在此期间您希望能够与应用程序中的任何内容进行交互,如果您愿意,您可以发布另一个延迟,如第一个延迟......或链式异步任务......

我建议您使用ViewFlipper,它可以保存片段或视图并在它们之间进行迭代,还可以使用 xml 添加一些转换,非常简单并且效果很好。

viewFlipper.setAnimation(AnimationUtils.loadAnimation(this,
            R.anim.push_from_right_in));
// this animations are XML in res-> anim folder
viewFlipper.showPrevious(); // go to the next fragment in order

您可以在每个新动画之间设置延迟......

viewFlipper.startFlipping();

你也可以从 xml 中设置很多东西,比如动画之间的时间。

<ViewFlipper
    android:id="@+id/signup_layout_viewFlipper"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_below="@id/headerFragment"
    android:flipInterval="1111" >

推送视图的动画:

<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:duration="300"
android:fromXDelta="100%"
android:fromYDelta="0%"
android:toXDelta="0%"
android:toYDelta="0%" />

希望有帮助:)

问候

于 2012-07-09T13:47:59.417 回答