0

我想更改我的Android手機應用程序的主視圖。目前,用戶可以從ListView中選擇項目,開啓新的活動。要選擇不同的活動,用戶必須返回到列表。我不希望使用pogo-sticking,而是使用ViewPager左右滑動頁面瀏覽文檔。可以有許多文檔,所以我最多一次最多可以加載3個頁面 - 當前頁面,上一頁面和下一頁。來回分頁應該添加和刪除左右頁面。我創建了一個實現FragmentStatePagerAdapter的適配器,可以很好地處理靜態內容(例如TextViews)。還刪除網頁似乎工作正常(不包括在這裏)。但是當我添加例如當分頁時,EditText內容會從一個頁面複製到下一個頁面。使用ViewPager的主詳圖視圖

以下是適配器和活動的代碼。我有兩個問題:

  1. 我的適配器有什麼問題導致從一個片段到另一個片段不希望地複製EditText
  2. 這是我的第一槍,它可能遠不是最佳實施。但我覺得這是一個常見的用例,我幾乎覺得它會有一個現成的框架。這可以實現更容易嗎?

尋呼機適配器:

public class DetailPagerAdapter extends FragmentStatePagerAdapter { 

    private final List<Fragment> mFragments; 
    private final static String TAG = "DetailPagerAdapter"; 

    public DetailPagerAdapter(FragmentManager fm, List<Fragment> fragments) { 
     super(fm); 
     mFragments = fragments; 
    } 

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

    @Override 
    public int getItemPosition(Object object) { 
     return PagerAdapter.POSITION_NONE; 
    } 

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

    public void addItem(Fragment fragment) { 
     mFragments.add(fragment); 
     notifyDataSetChanged(); 
    } 

    public void removeItem(int position) { 
     mFragments.remove(position); 
     notifyDataSetChanged(); 
    } 

    public void insertItem(int position, Fragment fragment) { 
     mFragments.add(position, fragment); 
     notifyDataSetChanged(); 
    } 
} 

PagingActivity基類:

public abstract class PagingActivity 
     extends AppCompatActivity 
     implements ViewPager.OnPageChangeListener { 

    protected ViewPager mViewPager; 
    DetailPagerAdapter mViewPagerAdapter; 
    protected ArrayList<String> mAllItemIds; 
    private String mPreviousItemId; 
    private String mCurrentItemId; 
    private String mNextItemId; 

    private boolean mMuteOnPageSelected = false; 


    protected abstract Fragment getNewPageFragment(String id); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     List<Fragment> initialFragments = new ArrayList<>(); 

     int currentItemIndex = mAllItemIds.indexOf(mCurrentItemId); 
     int pageSelection = 1; 
     // Add previous view. 
     if (currentItemIndex > 0) { 
      mPreviousItemId = mAllItemIds.get(mAllItemIds.indexOf(mCurrentItemId) - 1); 
      initialFragments.add(getNewPageFragment(mPreviousItemId)); 
     } else { 
      pageSelection = 0; 
      mPreviousItemId = null; 
     } 
     // Add current view. 
     initialFragments.add(getNewPageFragment(mCurrentItemId)); 
     // Add next view. 
     if (currentItemIndex < mAllItemIds.size() - 1) { 
      mNextItemId = mAllItemIds.get(mAllItemIds.indexOf(mCurrentItemId) + 1); 
      initialFragments.add(getNewPageFragment(mNextItemId)); 
     } else { 
      mNextItemId = null; 
     } 

     mViewPagerAdapter = new DetailPagerAdapter(getSupportFragmentManager(), initialFragments); 
     mViewPager.setAdapter(mViewPagerAdapter); 
     mViewPager.setCurrentItem(pageSelection); 

     mViewPager.addOnPageChangeListener(this); 
    } 

    @Override 
    public void onPageSelected(int position) { 

     if (!mMuteOnPageSelected) { 
      mCurrentItemId = ((PagingFragment) (mViewPagerAdapter.getItem(mViewPager.getCurrentItem()))).getItemId(); 
      int currentItemIndex = mAllItemIds.indexOf(mCurrentItemId); 

      // Navigated to the right. 
      if (position == mViewPagerAdapter.getCount() - 1) { 
       // Add next if not already pointing at the last available item. 
       if (currentItemIndex < mAllItemIds.size() - 1) { 
        mNextItemId = mAllItemIds.get(mAllItemIds.indexOf(mCurrentItemId) + 1); 
        mViewPagerAdapter.addItem(getNewPageFragment(mNextItemId)); 
       } else { 
        mNextItemId = null; 
       } 
       // If it succeeds remove first item. 
       int itemCount = mViewPagerAdapter.getCount(); 
       if ((itemCount > 3) || ((itemCount == 3) && (currentItemIndex == mAllItemIds.size() - 1))) { 
        mMuteOnPageSelected = true; 
        mViewPagerAdapter.removeItem(0); 
        mViewPager.setCurrentItem(1); 
        mMuteOnPageSelected = false; 
       } 
      } 

      // Navigated to the left. 
      else if (position == 0) { 
       // Add item on the left if not already pointing at the first available item. 
       if (currentItemIndex > 0) { 
        mPreviousItemId = mAllItemIds.get(mAllItemIds.indexOf(mCurrentItemId) - 1); 
        mViewPagerAdapter.insertItem(0, getNewPageFragment(mPreviousItemId)); 
       } else { 
        mPreviousItemId = null; 
       } 
       // Check if last item needs to be removed and selection updated. 
       int itemCount = mViewPagerAdapter.getCount(); 
       if (itemCount == 3) { 
        if (currentItemIndex == 0) { 
         // Points to the first of two items. 
         // -> do not change selection 
         // -> remove rightmost item. 
         mViewPagerAdapter.removeItem(itemCount - 1); 
        } else if (currentItemIndex == mAllItemIds.size() - 2) { 
         // Will point to the middle of 3 items. 
         // -> nothing to remove 
         // -> select middle page. 
         mMuteOnPageSelected = true; 
         mViewPager.setCurrentItem(1); 
         mMuteOnPageSelected = false; 
        } 
       } else if (itemCount > 3) { 
        // Pager contains 4 items, first item selected. 
        // -> remove rightmost item 
        // -> select middle page. 
        mMuteOnPageSelected = true; 
        mViewPagerAdapter.removeItem(itemCount - 1); 
        mViewPager.setCurrentItem(1); 
        mMuteOnPageSelected = false; 
       } 
      } 

      mViewPagerAdapter.notifyDataSetChanged(); 
     } 
    } 
} 

回答

0

第二個問題是在鍵:是的,至少當前狀態,可以實現更加容易通過讓適配器處理完整的項目數組。 FragmentStatePagerAdapter只根據需要一次加載儘可能多的片段,因此它可以處理我在活動中完成的所有手動工作。

尋呼機適配器

public class MyPagerAdapter extends FragmentStatePagerAdapter { 

    private List<String> mAllItemIds; 

    public MyPagerAdapter(Context context, FragmentManager fm) { 
     super(fm); 
     mAllItemIds = ... 
    } 

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

    @Override 
    public int getItemPosition(Object object) { 
     return PagerAdapter.POSITION_NONE; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return MyFragment.newInstance(mAllItemIds.get(position)); 
    } 

    public void removeItem(int position) { 

     // add needed code here to remove item also from source 
     // ... 

     mAllItemIds.remove(position); 
     notifyDataSetChanged(); 
    } 
} 

活動

public abstract class PagingActivity extends AppCompatActivity { 

    protected ViewPager mViewPager; 
    MyPagerAdapter mViewPagerAdapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mViewPager = (ViewPager)findViewById(R.id.viewPager); 
     mViewPagerAdapter = new MyPagerAdapter(this, getSupportFragmentManager()); 
     mViewPager.setAdapter(mViewPagerAdapter); 
    } 

    private void deleteItem() { 
     mViewPagerAdapter.removeItem(mViewPager.getCurrentItem()); 
    } 
} 
相關問題