2014-09-25 43 views
0

我使用PageViewer和FragmentPageAdapter实现了swipable选项卡页面。 我想在登录后更改所有片段。如何替换FragmentPageAdapter中的所有片段

public class TabFragmentPagerAdapter extends FragmentPagerAdapter implements FragmentChangeListener { 
    TabFragment tabFragment[]; 
    FragmentManager mFragmentManager; 
    boolean mNeedRefresh = false; 

    public TabFragmentPagerAdapter(FragmentManager fm) { 
     super(fm); 
     tabFragment = new TabFragment[4]; 
     mFragmentManager = fm; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     // getItem is called to instantiate the fragment for the given page. 
     Log.d(this.toString(), "getItem:position="+position); 
     if (position<0 || position>getCount()) 
      return null; 

     if (tabFragment[position]==null) { 
      switch (position) { 
      case 0: 
       tabFragment[position] = MapFragment.newInstance(this, position); 
       break; 
      default: 
       tabFragment[position] = BeforeLoginFragment.newInstance(this, position); 
       break; 
      } 
     } 

     return tabFragment[position]; 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     Log.d(this.toString(), "getItemPosition:object="+object.toString()); 

     int tabPosition = ((TabFragment)object).getTabPosition(); 
     //if (mNeedRefresh && ((TabFragment)object).getFragmentClassName() != tabFragment[tabPosition].getFragmentClassName()) { 
     if (((TabFragment)object).getFragmentClassName() == tabFragment[tabPosition].getFragmentClassName()) { 
      Log.d(this.toString(), "POSITION_UNCHANGED"); 
      return POSITION_UNCHANGED; 
     } else { 
      mNeedRefresh = false; 
      Log.d(this.toString(), "POSITION_NONE"); 
      return POSITION_NONE; 
     } 
    } 

    @Override 
    public int getCount() { 
     return 4; 
    } 

    @Override 
    public void onLoginChangeRequest() { 
     Log.d(this.toString(), "onLoginChangeRequest"); 
     FragmentTransaction transaction = mFragmentManager.beginTransaction(); 
     for (int i=1; i<getCount(); i++) 
     { 
      transaction.remove(tabFragment[i]); 

      switch (i) { 
      case 1: 
      case 2: 
       tabFragment[i] = MapFragment.newInstance(this, i); 
       break; 
      case 3: 
       tabFragment[i] = MapFragment.newInstance(this, i); 
       break; 
      } 
     } 
     transaction.commit(); 
     mNeedRefresh = true; 
     notifyDataSetChanged(); 
    } 
} 

public class RegisterStep03Fragment extends TabFragment implements OnClickListener, OnTaskCompleted { 

    @Override 
    public void onClick(View v) { 
     final String items[] = getResources().getStringArray(R.array.item_array_gender); 

     switch (v.getId()) { 
     case R.id.completeButton: 
      RegisterNewUser(); 
     } 
    } 

    private void RegisterNewUser() { 
     DownloadJSONObjectAsyncTask task = new DownloadJSONObjectAsyncTask(); 
     task.setOnTaskCompletedListener(this); 

     task.execute(...); 
    } 

    @Override 
    public void onTaskCompleted(JSONObject jsonObj) { 
     try { 
      if (jsonObj.getString("result").equals("success")) { 
       getListener().onLoginChangeRequest(); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

但是当我在上面的源代码中调用“RegisterNewUser”方法时,会发生以下错误。 我在这里做错了什么?

FATAL EXCEPTION: main 
java.lang.NullPointerException 
    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:651) 
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460) 
    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:472) 
    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141) 
    at android.support.v4.view.ViewPager.dataSetChanged(ViewPager.java:892) 
    at android.support.v4.view.ViewPager$PagerObserver.onChanged(ViewPager.java:2805) 
    at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37) 
    at android.support.v4.view.PagerAdapter.notifyDataSetChanged(PagerAdapter.java:276) 
    at com.flagmon.adapter.TabFragmentPagerAdapter.onLoginChangeRequest(TabFragmentPagerAdapter.java:132) 
    at com.flagmon.fragment.RegisterStep03Fragment.onTaskCompleted(RegisterStep03Fragment.java:189) 
    at com.flagmon.task.DownloadJSONObjectAsyncTask.onPostExecute(DownloadJSONObjectAsyncTask.java:38) 
    at com.flagmon.task.DownloadJSONObjectAsyncTask.onPostExecute(DownloadJSONObjectAsyncTask.java:1) 
    at android.os.AsyncTask.finish(AsyncTask.java:631) 
    at android.os.AsyncTask.access$600(AsyncTask.java:177) 
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:5103) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:525) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
    at dalvik.system.NativeStart.main(Native Method) 

回答

0

我改变了如下的源代码。似乎我忘了检查我想更改的片段是否已初始化。

public void onLoginChangeRequest() { 
    Log.d(this.toString(), "onLoginChangeRequest"); 
    FragmentTransaction transaction = mFragmentManager.beginTransaction(); 
    for (int i=1; i<getCount(); i++) 
    { 
     if (tabFragment[i] != null) { 

      transaction.remove(tabFragment[i]); 

      switch (i) { 
      case 1: 
      case 2: 
       tabFragment[i] = MapFragment.newInstance(this, i); 
       break; 
      case 3: 
       tabFragment[i] = MapFragment.newInstance(this, i); 
       break; 
      } 
     } 
    } 
    transaction.commit(); 
    notifyDataSetChanged(); 
}