这是我的情景:
我在Activity中有一个ViewPager,其中包含6个Fragment。我禁用了通过手指滑动进行分页的功能,因此每当我想要滑动时,我会使用相关按钮并执行以下操作:
在每个被滑动的碎片(在滑动完成后)中,我想向我的服务器发送一个GET请求,获取一些数据并显示在该碎片中。为了实现这个目的: 第一种方法:我在我的碎片中使用了以下代码,当碎片可见时立即运行:
我在Activity中有一个ViewPager,其中包含6个Fragment。我禁用了通过手指滑动进行分页的功能,因此每当我想要滑动时,我会使用相关按钮并执行以下操作:
viewPager.setCurrentItem(viewPager.getCurrentItem() + 1, true);
在每个被滑动的碎片(在滑动完成后)中,我想向我的服务器发送一个GET请求,获取一些数据并显示在该碎片中。为了实现这个目的: 第一种方法:我在我的碎片中使用了以下代码,当碎片可见时立即运行:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser)
{
sendGetRequest();
}
}
但是,这里有一个问题:当片段可见时,setUserVisibleHint正好执行,因此滑动动画会出现一些延迟(不够流畅)。
因此,我采用了第二种方法:
我在托管活动中向ViewPager添加了一个OnPageChangeListener(),如下所示:
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
int CurrentPossition = 0;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { }
@Override
public void onPageSelected(int position) {
CurrentPossition = position;
}
@Override
public void onPageScrollStateChanged(int state) {
if(state == ViewPager.SCROLL_STATE_IDLE && CurrentPossition != 0){
Toast.makeText(getBaseContext(),"finished" , Toast.LENGTH_SHORT).show();
try{
new fragment_two().sendGetRequest();;
}catch(Exception ex){
ex.printStackTrace();
}
}
}
});
它的工作很好,当滑动完成时,toast立即显示出来,但与完全可见的片段不同,当sendGetRequest()运行时,我遇到了NullPointerException。
以下是StackTrace :
04-08 20:15:37.840 12848-12848/com.example.mohamad.travelagency W/System.err: java.lang.NullPointerException
04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err: at android.content.ContextWrapper.getApplicationInfo(ContextWrapper.java:152)
04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err: at android.view.ContextThemeWrapper.getTheme(ContextThemeWrapper.java:103)
04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err: at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:143)
04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err: at android.app.AlertDialog.<init>(AlertDialog.java:98)
04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err: at android.app.ProgressDialog.<init>(ProgressDialog.java:77)
04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err: at com.example.mohamad.travelagency.fragment_two.GetServetData_L1(fragment_two.java:458)
04-08 20:15:37.850 12848-12848/com.example.mohamad.travelagency W/System.err: at com.example.mohamad.travelagency.MainActivity$1.onPageScrollStateChanged(MainActivity.java:124)
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.support.v4.view.ViewPager.dispatchOnScrollStateChanged(ViewPager.java:1811)
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.support.v4.view.ViewPager.setScrollState(ViewPager.java:404)
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.support.v4.view.ViewPager.access$000(ViewPager.java:91)
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.support.v4.view.ViewPager$3.run(ViewPager.java:250)
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.view.Choreographer.doCallbacks(Choreographer.java:574)
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.view.Choreographer.doFrame(Choreographer.java:543)
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.os.Handler.handleCallback(Handler.java:733)
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95)
04-08 20:15:37.860 12848-12848/com.example.mohamad.travelagency W/System.err: at android.os.Looper.loop(Looper.java:136)
04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5271)
04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err: at java.lang.reflect.Method.invokeNative(Native Method)
04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err: at java.lang.reflect.Method.invoke(Method.java:515)
04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:851)
04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:667)
04-08 20:15:37.870 12848-12848/com.example.mohamad.travelagency W/System.err: at dalvik.system.NativeStart.main(Native Method)
任何想法都可以。最好的问候。
答案:
丹尼尔·纽金特的代码很好用,除了在发送GET请求时显示ProgressDialog之外,我使用了:
final ProgressDialog dialog = new ProgressDialog(new MainActivity());
这段代码也返回了NullPointerException,我把它移除后现在运行良好。
new Activity()
,那行代码应该是final ProgressDialog dialog = new ProgressDialog(getActivity());
。参见这里:https://dev59.com/-GAf5IYBdhLWcg3wSQ8z - Daniel Nugent