所以看起来当使用 ViewPager 时,onPageSelected 监听器不会被调用为第一页与 this 相同的问题.
我有一些逻辑可以为当前选定的页面填充一些更昂贵的 UI 元素,并且在页面更改时可以使用,但 它不适用于第一页。
如果我在监听器之后设置当前项,则第一页会触发回调,但 View 尚未初始化,因此我无法对其进行操作:
// Inside PagerAdapter.instantiateItem
ViewHolder vh = new ViewHolder();
cursor.moveToPosition(position);
vh.view = adapter.newView(context, cursor, null);
// Set position as tag so we can retrieve it with findViewByTag
vh.view.setTag(position);
((ViewPager) collection).addView(vh.view,0);
return vh;
// Inside MyActivity.onCreate
pagerAdapter = new SingleMessagePagerAdapter(this, cursor);
pager = (ViewPager)findViewById(R.id.message_pager);
pager.setAdapter(pagerAdapter);
pager.setOnPageSelectedListener(this);
pager.setCurrentItem(selectedItem);
// Inside MyActivity.onPageSelected
// Retrieve tagged view
View view = pager.findViewWithTag(position);
这里 view
最终为 null,因为 PagerAdapter.instantiateItem
尚未运行。所以我想我的问题是,在 Activity 生命周期的哪个阶段,我可以确定 ViewPager 已经初始化了 View ?我尝试在 Activity.onAttachedToWindow
和 Activity.onResume
中执行此操作,但似乎这两个都在 PagerAdapter.instantiateItem
之前被触发。
最佳答案
我想知道为什么您不只是在 Fragment 本身而不是在托管 Activity 中提到的逻辑。 ViewPager 在当前 fragment 的任一侧缓冲几个 fragment ,因此它们在后台设置,并在用户滑动到它们时准备就绪。将逻辑放入 onPageSelected
将意味着绕过此功能,并且在用户滑动到页面之前不会执行繁重的工作。
假设由于某种原因您不能执行上述操作,为什么不使用 Interface with a callback function .在 fragment 的 onCreateView
函数中触发回调,让 Activity 知道它已完全实例化。
关于android - ViewPager onPageSelected 用于第一页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12154870/