【发布时间】:2017-02-23 09:16:59
【问题描述】:
当我尝试添加多个 pageChangleListener 时,ViewPager 出现了一个奇怪的问题。我尝试寻找具有类似描述的帖子/问题,但找不到任何内容,所以我们开始:
短版:第一页只有一个 onPageChangeListener 触发,但第二页触发了多个监听器。
长版: 在我的应用程序中,我需要每个 ViewPager 都有多个 OnPageChangeListeners。尽管我在 android 文档中找不到任何确认,但函数“addOnPageChangeListener”的名称表明我可以将多个侦听器设置为同一个 ViewPager(特别是因为它曾经是“setPageChangeListener”,他们将其更改为“addPageChangeListener”)。现在,我有一些代码需要在每次在我的应用程序的任何 ViewPager 中选择页面时运行,所以我创建了自己的 ViewPager 和 OnPageChangeListener 类:
public class MyViewPager extends ViewPager
{
private ArrayList<Sequence> mSequenceList;
public MyViewPager(Context context)
{
super(context);
}
public MyViewPager(Context context, AttributeSet attrs)
{
super(context, attrs);
}
@Override
public void setAdapter(PagerAdapter adapter)
{
super.setAdapter(adapter);
mSequenceList = ((MyPagerAdapter)adapter).getSequences();
addOnPageChangeListener(new MyOnPageChangedListener(mSequenceList));
Log.i("aaaaa", "added listener from MyViewPager");
}
}
我还做了自己的页面更改监听器:
public class MyOnPageChangedListener implements MyViewPager.OnPageChangeListener
{
private static final String TAG = "MyOnPageChangedListener";
private ArrayList<Sequence> sequenceList;
public MyOnPageChangedListener(ArrayList<Sequence> sequenceList)
{
this.sequenceList = sequenceList;
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{
//do nothing
}
@Override
public void onPageSelected(int position)
{
Log.i("aaaaa", "selecting page " + position + " from my listener");
//do something
}
@Override
public void onPageScrollStateChanged(int state)
{
//do nothing
}
我的活动的 OnCreate 中也有这个:
mPageChangedListener = new ViewPager.OnPageChangeListener()
{
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{
//do nothing
}
@Override
public void onPageSelected(int position)
{Log.i("aaaaa", "selecting page " + position + " from activity");
//do something
}
@Override
public void onPageScrollStateChanged(int state)
{
//do nothing
}
};
mViewPager.addOnPageChangeListener(mPageChangedListener);
Log.i("aaaaa", "added listener from activity");
我在我的活动中使用它来触发第一页的 onPageSelected
@Override
protected void onResume()
{
super.onResume();
mViewPager.post(new Runnable()
{
@Override
public void run()
{
mPageChangedListener.onPageSelected(mViewPager.getCurrentItem());
}
});
}
但是当我运行应用程序时,我得到了一些奇怪的行为。这是日志输出:
02-23 03:08:41.192 17147-17147/com.*** I/aaaaa: added listener from MyViewPager
02-23 03:08:41.193 17147-17147/com.*** I/aaaaa: added listener from activity
02-23 03:08:41.273 17147-17147/com.*** I/aaaaa: selecting page 0 from activity
02-23 03:09:03.609 17147-17147/com.*** I/aaaaa: selecting page 1 from my listener
02-23 03:09:03.609 17147-17147/com.*** I/aaaaa: selecting page 1 from activity
如您所见,添加了两个侦听器,但对于第一页(索引 0),仅触发来自活动的侦听器,而对于第二页(索引 1),两个侦听器都被触发。
这对我来说是一个主要问题,因为我自己的 onPageChangedListener 必须为每个页面触发。
有人知道为什么会发生这种情况以及如何解决吗?
【问题讨论】: