viewPager.setCurrentItem() 不起作用

aad*_*san 3 android android-fragments android-viewpager

setCurrentItem() 函数不适用于以下 android(java) 代码如何使其工作?

    Intent i = getIntent();
    int position = i.getIntExtra("img", 0);
    viewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
    ImageAdapter adapter = new ImageAdapter(this);
    viewPager.setAdapter(adapter);
    viewPager.setCurrentItem(position);
Run Code Online (Sandbox Code Playgroud)

小智 7

private ViewPager viewPager;

@Override
public void onResume() {
 Intent i = getIntent();
int position = i.getIntExtra("img", 0);
viewPager.postDelayed(new Runnable() {

    @Override
    public void run() {
        viewPager.setCurrentItem(position);
    }
 }, 100);
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这可能会回答这个问题,但还应该解释为什么以及如何解决问题。 (3认同)

goe*_*mic 7

弗兰克是对的。要提供独立的滚动设备,您应该使用 onGlobalLayoutListener。从而可以保证在调用 viewPager.setCurrentItem(position) 时渲染视图。否则 setCurrentItem 不会有任何效果,因为视图尚未呈现。

viewPager.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
        {
            @Override
            public void onGlobalLayout()
            {
                viewPager.setCurrentItem(position, false);
            }
        });
Run Code Online (Sandbox Code Playgroud)

我知道这个问题已经很老了,但也许其他人会发现这很有用!


Yos*_*sef 6

只需androidx使用视图扩展添加一个较短的答案kotlin

view_pager.doOnLayout {
    view_pager.setCurrentItem(position, false)
}
Run Code Online (Sandbox Code Playgroud)

请注意,使用全局布局的先前答案并未删除后记OnGlobalLayoutListener,这是不可取的。

androidxextdoOnLayout就是这样做的。

请确保您有 gradle 依赖项:implementation 'androidx.core:core-ktx:1.3.2'