从ViewPager获得专注的视图

Sup*_*oot 50 android view viewpage pager android-viewpager

我使用ViewPager通过左/右滑动切换视图.

ViewPager需要一个适配器,所以我构建了这个:

public class ListViewPagerAdapter extends PagerAdapter {

protected static final String TAG = "ListViewPagerAdapter";
protected static final int NUM_VIEWS = 3;

protected final Activity mActivity;

public ListViewPagerAdapter(Activity activity) {
    mActivity = activity;
}

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

@Override
public void startUpdate(View container) {}

@Override
public Object instantiateItem(View container, int position) {
    // ViewPager
    ViewPager viewPager = (ViewPager) container;

    // Wird verwendet, um die Views aufzurufen
    LayoutInflater layoutInflater = mActivity.getLayoutInflater();

    // Standardmäßig ist news eingeblendet
    View view = layoutInflater.inflate(R.layout.news_fragment, null);
    // Falls sich die Position verändert, so verändert sich auch die View
    if (position == 0) {
        view = layoutInflater.inflate(R.layout.favorite_fragment, null);
    } else if (position == 2) {
        view = layoutInflater.inflate(R.layout.videos_fragment, null);
    }

    // View einblenden
    viewPager.addView(view, 0);

    return view;
}

@Override
public void destroyItem(View container, int position, Object object) {
    // ViewPager
    ViewPager viewPager = (ViewPager) container;
    // View
    View view = (View) object;

    // View löschen
    viewPager.removeView(view);
}

@Override
public void finishUpdate(View container) {}

@Override
public boolean isViewFromObject(View view, Object object) {
    View _view = (View) object;
    return view == _view;
}

@Override
public Parcelable saveState() {
    return null;
}

@Override
public void restoreState(Parcelable state, ClassLoader loader) {}
 }
Run Code Online (Sandbox Code Playgroud)

现在,我想通过viewpager获取当前的焦点视图.我试过getChildAt(x),但它不起作用.

是否有一些示例,或者您是否知道如何获取当前视图?

谢谢

Mic*_* G. 88

可以通过覆盖[PagerAdapter.setPrimaryItem]来保存当前活动对象(View,Fragment,...)(http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html# setPrimaryItem%28android.view.ViewGroup,%20int,%20java.lang.Object%29)方法.例如:

private View mCurrentView;

@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
    mCurrentView = (View)object;
}
Run Code Online (Sandbox Code Playgroud)

  • 在寻呼机适配器中没有内置当前可见的项目实现是一种遗憾.精彩的回答,谢谢. (9认同)
  • 注意:在页面滑动时多次调用此方法 (8认同)
  • @osayilgan,它没有被弃用.不推荐使用的函数是另一个:`setPrimaryItem(View container,int position,Object object)` (2认同)

Ste*_*ren 41

你必须注册一个听众ViewPager:

pager.setOnPageChangeListener(new MyPageChangeListener()); 
Run Code Online (Sandbox Code Playgroud)

您必须通过扩展存根侦听器来自定义侦听器:

private int focusedPage = 0;
private class MyPageChangeListener extends ViewPager.SimpleOnPageChangeListener {
    @Override
    public void onPageSelected(int position) {
        focusedPage = position;
    }
}
Run Code Online (Sandbox Code Playgroud)

我通过查看兼容性库中的ViewPager.java源代码找到了这个.我读到我们可以做更多,例如捕获onPageScrollStateChanged.

为了构建适配器,我使用了此博客文章中的代码.你可能想看看.

  • 我知道如何让你获得当前的位置,但我不清楚你如何从中得到当前的观点. (17认同)
  • 它仅在视图计数小于3时有效 (17认同)
  • 请注意,如果将ViewPagerIndicator与ViewPager结合使用,则必须在指示器上设置侦听器,而不是在寻呼机上设置. (8认同)
  • @JoeRegan我能够从`ViewPager`上的`getChildAt(int)`获取当前视图,给出它从`OnPageChangeListener`得到的最后一个已知位置. (2认同)

art*_*nig 41

您可以在instantiateItem方法中向创建的视图添加标记:

view.setTag(position);
Run Code Online (Sandbox Code Playgroud)

稍后您可以通过以下方式访问当前所选视图:

mPager.findViewWithTag(mPager.getCurrentItem());
Run Code Online (Sandbox Code Playgroud)