我在我的应用程序中使用 viewpager 来动态加载视图并水平滚动它们。我还使用 pageTransform 来缩放下一个和上一个视图。已从
http://developer.android.com/training/animation/screen-slide.html
下一个视图中的每一个都取决于前一个视图的用户响应。在每个 OnPageSelected 上,我正在加载下一个视图
mPagerAdapter.addView(ViewToBeAdded, AddAtPostion); //Empty previous view holder
mViewPager.setAdapter(mPagerAdapter);
问题步骤 1:一旦我做了一个 setAdapter,整个 viewpager 就会滚动到第一个位置,(我不确定为什么会这样)。
问题第 2 步:为了规避问题 1,我打电话给
mViewPager.setCurrentItem(AddAtPostion, false);.
//如果我调用第二个参数为true,viewPager从第一个项目滚动到当前项目。
但是,当我调用它时,由 pageTransform 设置的转换被删除(因为 get 仅应用于滚动),并且前一个视图持有者显示没有任何转换。
问题步骤 3:为了规避问题 2,我在 setCurrentItem 之后添加了 runnable 以调用假拖动(从尽快将 PageTransformer 应用到 PagerView 中了解到)
private Handler mhandler = new Handler();
private Runnable mrunnable = new Runnable() {
public void run() {
mViewPager.beginFakeDrag();
mViewPager.fakeDragBy(0f);
mViewPager.endFakeDrag();
}
};
//Called as mhandler.postDelayed(mrunnable, 10); after setCurrentItem.
这确实解决了我应用转换的问题。但是,在应用转换之前会看到空视图持有者的闪光。我已经黔驴技穷了。我是 Android 的初学者,不知道如何解决任何问题。如果问题 1 本身得到解决,我就不必寻找解决方法。
下面发布的是添加视图并使用空布局膨胀前一个视图的代码
public int addView(View v, int position) {
prevPos = currPos;
currPos = position;
LayoutInflater inflater = (LayoutInflater) mContext .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(prevPos != -1)
{
views.set(prevPos, ((View) inflater.inflate(R.layout.empty_template, null, false)));
}
views.set(currPos, v);
return position;
}
日志猫:
06-20 16:50:54.890: D/AndroidRuntime(8810): Shutting down VM
06-20 16:50:54.890: W/dalvikvm(8810): threadid=1: thread exiting with uncaught exception (group=0x40bc51f8)
06-20 16:50:54.914: E/AndroidRuntime(8810): FATAL EXCEPTION: main
06-20 16:50:54.914: E/AndroidRuntime(8810): java.lang.NullPointerException
06-20 16:50:54.914: E/AndroidRuntime(8810): at android.support.v4.view.ViewPager.endFakeDrag(ViewPager.java:2234)
06-20 16:50:54.914: E/AndroidRuntime(8810): at mpkgname.mactivityname$1.run(mactivityname.java:202)
06-20 16:50:54.914: E/AndroidRuntime(8810): at android.os.Handler.handleCallback(Handler.java:605)
06-20 16:50:54.914: E/AndroidRuntime(8810): at android.os.Handler.dispatchMessage(Handler.java:92)
06-20 16:50:54.914: E/AndroidRuntime(8810): at android.os.Looper.loop(Looper.java:137)
06-20 16:50:54.914: E/AndroidRuntime(8810): at android.app.ActivityThread.main(ActivityThread.java:4514)
06-20 16:50:54.914: E/AndroidRuntime(8810): at java.lang.reflect.Method.invokeNative(Native Method)
06-20 16:50:54.914: E/AndroidRuntime(8810): at java.lang.reflect.Method.invoke(Method.java:511)
06-20 16:50:54.914: E/AndroidRuntime(8810): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
06-20 16:50:54.914: E/AndroidRuntime(8810): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
06-20 16:50:54.914: E/AndroidRuntime(8810): at dalvik.system.NativeStart.main(Native Method)
06-20 16:51:19.992: D/dalvikvm(8810): Debugger has detached; object registry had 658 entries