我正在使用viewpager在多个页面上显示一些文本。我正在尝试获取当前视图,我选择了一个新页面。我想获取当前视图的原因是因为基于页码我正在改变一些视图组件的一些属性,如textview,image等。 我使用以下代码进行相同的
ViewPager mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
View CurrView;
OnPageChangeListener pageChangelistener = new OnPageChangeListener() {
@Override
public void onPageSelected(int pageSelected) {
currView = mPager.getChildAt(mPager.getCurrentItem());
myTextView = (TextView)currView.findViewById(R.id.myTextView);
loadBookmarkSetting(pageSelected);//do some changes in myTextView properties based on the page number }
mPager.setOnPageChangeListener(pageChangelistener);
现在我面临的问题是,在滚动3页后,当我到第4页时,我在行上得到nullpointer异常" myTextView =(TextView)currView.findViewById(R.id.myTextView); &#34 ;.这是因为currView为null。如果我在这里做错了什么想法。有没有其他方法可以捕获viewpager中的当前视图(页面),以便我可以根据我所在的页码对视图进行更改?
答案 0 :(得分:56)
您可以将setTag与您在instantiateItem方法(PagerAdapter)中返回的视图一起使用。
因此,当您在PagerAdapter中实例化视图时,方法也是instantiateItem(ViewGroup container, int position))
,您应该将setTag用于您的视图。
像这样:
view.setTag("myview" + position);
return view;
当您需要当前视图时:
View view = (View) pager.findViewWithTag("myview" + pager.getCurrentItem());
答案 1 :(得分:2)
您使用此方法:
@Nullable
public static View getActiveView(@Nonnull final ViewPager viewPager) {
final PagerAdapter adapter = viewPager.getAdapter();
if (null == adapter || adapter.getCount() == 0 || viewPager.getChildCount() == 0) {
return null;
}
int position;
final int currentPosition = viewPager.getCurrentItem();
for (int i = 0; i < viewPager.getChildCount(); i++) {
final View child = viewPager.getChildAt(i);
final LayoutParams layoutParams = (LayoutParams) child.getLayoutParams();
if (layoutParams.isDecor) {
continue;
}
final Field positionField;
try {
positionField = LayoutParams.class.getDeclaredField("position");
positionField.setAccessible(true);
position = positionField.getInt(layoutParams);
} catch (NoSuchFieldException e) {
break;
} catch (IllegalAccessException e) {
break;
}
if (position == currentPosition) {
return child;
}
}
return null;
}
答案 2 :(得分:0)
我在我的适配器中添加了一个SparseArray,并在destroyItem()
中添加了该视图,并将其移除val views = SparseArray<View>()
override fun instantiateItem(container: ViewGroup, position: Int): Any
{
//...
container.addView(view)
views.put(position, view)
return view
}
override fun destroyItem(container: ViewGroup, position: Int, obj: Any)
{
views.remove(position)
container.removeView(obj as View)
}
fun showFooter(currentItem: Int) {
views[currentItem].footer_layout.animate().alpha(1f)
}
fun hideFooter(currentItem: Int) {
views[currentItem].footer_layout.animate().alpha(0f)
}
...
viewPager.addOnPageChangeListener(object: ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {
when (state) {
SCROLL_STATE_IDLE -> adapter.showFooter(viewPager.currentItem)
SCROLL_STATE_DRAGGING -> adapter.hideFooter(viewPager.currentItem)
}
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
override fun onPageSelected(position: Int) {}
})
然后我可以在适配器上调用方法:
{{1}}
答案 3 :(得分:0)
由于将offscreenPageLimit设置为3,因此会出现空指针异常。viewpager将仅存储3页。mPager.getChildAt(4)将获得空值。 要设置textview,可以使用适配器的片段管理器来获取所有片段,并获取该片段的视图。
adapter.fragmentManager.fragments[position1].view
答案 4 :(得分:-1)
您当前视图为空的原因是因为寻呼机适配器开始销毁其项目以提高内存效率。我发现的一种方法是覆盖寻呼机适配器的destroyItem()方法,并通过列表或parceable类保存数据。