0

我有一个ViewPager和一个PagerTabStrip的MainActivity。我也有一个SettingsFragment和MyFragmentStatePagerAdapter。我在删除碎片时遇到了问题,所以我尝试了几件事来结束我现在的工作。除非我删除一个片段,否则添加片段不是问题。要添加片段,我单击“+”并删除片段,然后单击片段中的按钮。添加到ViewPager的片段为空

例如,假设我添加片段“1”和“2”。然后我删除片段“1”,以便我留下“2”。一切都很好,直到我点击“+”。它添加了一个新的选项卡和页面,但显示了片段应该在的空白页面。如果我再次点击,我得到这个错误。

java.lang.IndexOutOfBoundsException: Invalid index 3, size is 3 
                      at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
                      at java.util.ArrayList.get(ArrayList.java:308) 
                      at com.angelwing.homebase.MyFragmentStatePagerAdapter.getPageTitle(MyFragmentStatePagerAdapter.java:41) 
                      at android.support.v4.view.PagerTitleStrip.updateText(PagerTitleStrip.java:282) 
                      at android.support.v4.view.PagerTitleStrip.updateTextPositions(PagerTitleStrip.java:341) 
                      at android.support.v4.view.PagerTabStrip.updateTextPositions(PagerTabStrip.java:290) 
                      at android.support.v4.view.PagerTitleStrip$PageListener.onPageScrolled(PagerTitleStrip.java:493) 
                      at android.support.v4.view.ViewPager.dispatchOnPageScrolled(ViewPager.java:1955) 
                      at android.support.v4.view.ViewPager.onPageScrolled(ViewPager.java:1924) 
                      at android.support.v4.view.ViewPager.pageScrolled(ViewPager.java:1862) 
                      at android.support.v4.view.ViewPager.computeScroll(ViewPager.java:1822) 
                      at android.view.View.updateDisplayListIfDirty(View.java:16451) 
                      at android.view.View.draw(View.java:17238) 
                      at android.view.ViewGroup.drawChild(ViewGroup.java:3923) 
                      at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3713) 
                      at android.view.View.updateDisplayListIfDirty(View.java:16459) 
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3907) 
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3887) 
                      at android.view.View.updateDisplayListIfDirty(View.java:16424) 
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3907) 
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3887) 
                      at android.view.View.updateDisplayListIfDirty(View.java:16424) 
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3907) 
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3887) 
                      at android.view.View.updateDisplayListIfDirty(View.java:16424) 
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3907) 
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3887) 
                      at android.view.View.updateDisplayListIfDirty(View.java:16424) 
                      at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3907) 
                      at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3887) 
                      at android.view.View.updateDisplayListIfDirty(View.java:16424) 
                      at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:325) 
                      at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:331) 
                      at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:366) 
                      at android.view.ViewRootImpl.draw(ViewRootImpl.java:3134) 
                      at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2933) 
                      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2522) 
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437) 
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7397) 
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920) 
                      at android.view.Choreographer.doCallbacks(Choreographer.java:695) 
                      at android.view.Choreographer.doFrame(Choreographer.java:631) 
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906) 
                      at android.os.Handler.handleCallback(Handler.java:739) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:158) 
                      at android.app.ActivityThread.main(ActivityThread.java:7224) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

我想你所要做的就是在适配器列表中添加和删除项目,所以我不明白为什么我有这样的问题。这是我的MainActivity和MyFragmentStatePagerAdapter的代码。

MyFragmentStatePagerAdapter

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.view.PagerAdapter; 
import android.util.Log; 
import java.util.ArrayList; 

public class MyFragmentStatePagerAdapter extends FragmentStatePagerAdapter 
{ 
    private ArrayList<SettingsFragment> fragmentList = new ArrayList<>(); 
    private ArrayList<String> fragmentTitleList = new ArrayList<>(); 

    public MyFragmentStatePagerAdapter(FragmentManager fm) 
    { 
     super(fm); 
    } 

    public void addFragment(SettingsFragment f, String title) 
    { 
     fragmentList.add(f); 
     fragmentTitleList.add(title); 
    } 

    public void deleteFragment (int pos) 
    { 
     fragmentList.remove(pos); 
     fragmentTitleList.remove(pos); 
    } 

    @Override 
    public Fragment getItem(int position) 
    { 
     return fragmentList.get(position); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) 
    { 
     return fragmentTitleList.get(position); 
    } 

    @Override 
    public int getCount() 
    { 
     return fragmentList.size(); 
    } 

    public void setPageTitle(int pos, String pageTitle) 
    { 
     fragmentTitleList.set(pos, pageTitle); 
    } 

    @Override 
    public int getItemPosition(Object object) 
    { 
     int position = fragmentList.indexOf(object); 

     if (position == -1) 
      return POSITION_NONE; 

     return position; 
//  return fragmentList.indexOf(object); 
    } 
} 

MainActivity

public class MainActivity extends AppCompatActivity 
{ 
    SharedPreferences sp; 
    private ViewPager viewPager; 
    private MyFragmentStatePagerAdapter adapter; 

    Set<String> baseNames; 

    final int MY_PERMISSIONS_ACCESS_FINE_LOCATION = 1001; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     sp = getSharedPreferences("com.angelwing.homebase", Context.MODE_PRIVATE); 

     ////// [Request Permissions] ////// 
     // if permission hasn't been granted yet, request permission 
     if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) 
     { 
      ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_ACCESS_FINE_LOCATION); 
     } 

     viewPager = (ViewPager) findViewById(R.id.viewPager); 
     adapter = new MyFragmentStatePagerAdapter(getSupportFragmentManager()); 
     viewPager.setAdapter(adapter); 

     // Get number of names 
     // Add those fragments 
     adapter.startUpdate(viewPager); 
     addFragments(); 
     adapter.finishUpdate(viewPager); 

     AdView bannerAd = (AdView) findViewById(R.id.bannerAd); 
     bannerAd.loadAd(new AdRequest.Builder().build()); 

     getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 
    } 

    public void addFragments() 
    { 
     baseNames = sp.getStringSet("baseNames", new HashSet<String>()); 

     SettingsFragment settingsFragment; 

     if (baseNames.isEmpty()) 
     { 
      settingsFragment = new SettingsFragment(); 
      settingsFragment.setIsNew(true); 

      settingsFragment.setName(""); 
      settingsFragment.setWifi(false); 
      settingsFragment.setData(false); 
      settingsFragment.setBluetooth(false); 
      settingsFragment.setVolume(true); 
      settingsFragment.setVolumeValue(50); 
      settingsFragment.setVibrate(false); 

      adapter.addFragment(settingsFragment, "New Base"); 
     } 
     else 
     { 
      for (String baseName : baseNames) 
      { 
       Log.i("Settings", "baseName: " + baseName); 

       settingsFragment = new SettingsFragment(); 
       settingsFragment.setIsNew(false); 

       settingsFragment.setName(baseName); 
       settingsFragment.setWifi(sp.getBoolean(baseName + "wifi", false)); 
       settingsFragment.setData(sp.getBoolean(baseName + "data", false)); 
       settingsFragment.setBluetooth(sp.getBoolean(baseName + "bluetooth", false)); 
       settingsFragment.setVolume(sp.getBoolean(baseName + "volume", false)); 
       settingsFragment.setVolumeValue(sp.getInt(baseName + "volumeValue", 50)); 
       settingsFragment.setVibrate(sp.getBoolean(baseName + "vibrate", false)); 

       adapter.addFragment(settingsFragment, baseName); 
      } 
     } 

     adapter.notifyDataSetChanged(); 
    } 

    public void deleteFragment(int pos) 
    { 
     adapter.startUpdate(viewPager); 
     adapter.deleteFragment(pos); 
     adapter.notifyDataSetChanged(); 
     adapter.finishUpdate(viewPager); 
    } 

    public MyFragmentStatePagerAdapter getAdapter() 
    { 
     return adapter; 
    } 

    public ViewPager getViewPager() 
    { 
     return viewPager; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    { 
     getMenuInflater().inflate(R.menu.mymenu, menu); 

     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected (MenuItem item) 
    { 
     Set<String> bN = sp.getStringSet("baseNames", new HashSet<String>()); 
     baseNames = new HashSet<>(bN); 

     if (item.getItemId() == R.id.addButton) 
     { 
      SettingsFragment settingsFragment = new SettingsFragment(); 
      settingsFragment.setIsNew(true); 

      settingsFragment.setName(""); 
      settingsFragment.setWifi(false); 
      settingsFragment.setData(false); 
      settingsFragment.setBluetooth(false); 
      settingsFragment.setVolume(true); 
      settingsFragment.setVolumeValue(50); 
      settingsFragment.setVibrate(false); 

      adapter.startUpdate(viewPager); 
      adapter.addFragment(settingsFragment, "New Base"); 
      adapter.notifyDataSetChanged(); 
      adapter.finishUpdate(viewPager); 
      viewPager.setCurrentItem(adapter.getCount() - 1); 

      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

回答

-1

我不知道你为什么在这种情况下使用FragmentStatePagerAdapter,尝试FragmentPagerAdapter。

+0

同样的问题,恐怕。 – Katie