2013-08-06 46 views
0

我試圖做一個基本上是由3個垂直滾動列表組成的一個片段。點擊列表中的項目將使用適當的數據填充列表右側的列表,等等。當點擊最右側列表中的項目時,將引入新的片段。因此,我試圖實現的是在最終項目被點擊時添加第二個片段的方法,並具有向右滑動將您帶回第一個片段並移除第二個片段的功能。看起來,使用具有自定義FragmentPagerAdapter的ViewPager是一種可行的方式,但我並不確定如何實現適配器以適應我的特定功能。刪除/添加一個頁面到ViewPager

我也在看這個帖子上的接受答案:dynamically add and remove view to viewpager。 它似乎接近我想要的,但我不太確定,我也不確定如何適應這個FragmentPagerAdapter,具體如何實現getItem()。

任何幫助,將不勝感激。

回答

0

如果有人有興趣,我相信我找到了一個適當的解決方案來解決我的問題。

我創建了我的FragmentPagerAdapter,以便正常初始化第一個頁面,但第二個頁面僅僅是稍後將初始化片段的容器。

public static class ContractDetailsPagerAdapter extends FragmentPagerAdapter { 
int numFrags = 2; 

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

    @Override 
    public Fragment getItem(int position) { 

     Fragment fragment = null; 
     String argObject = null; 

     switch (position) { 
     case 0: 
      fragment = new SectionsFragment(); 
      argObject = SectionsFragment.ARG_OBJECT; 
      break; 
     case 1: 
      fragment = new DetailsFragmentContainer(); 
      argObject = DetailsFragmentContainer.ARG_OBJECT; 
      break; 
     default: 
      Log.e("ContractDetailsPagerAdapter", "called getItem outofbounds"); 
      return null; 
     } 

     Bundle bundle = new Bundle(); 
     bundle.putInt(argObject, position+1); 
     fragment.setArguments(bundle); 
     return fragment; 
    } 

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

在FragmentPagerAdapter,SectionsFragment是具有3名列表視圖的第一片段,並且DetailsFragmentContainer僅僅是一個容器,將在稍後初始化DetailsFragment。

public class DetailsFragmentContainer extends Fragment { 

public static final String ARG_OBJECT = "details_fragment_container"; 

Bundle ids; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    ids = getArguments(); 
    View v = inflater.inflate(R.layout.fragments_container, container, false); 
    return v; 
} 

public void createDetailsFragment(int parentItemId) { 
    Fragment fragment = new DetailsFragment(); 
    ids.putInt(Columns.COLUMN_PARENTITEMID, parentItemId); 
    fragment.setArguments(ids); 
    getChildFragmentManager().beginTransaction().add(R.id.fragments_frame, fragment).commit(); 
} 

} 

和容器中的XML佈局:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/fragments_frame" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

</FrameLayout> 

的parentitemid是我需要後來拿到的時候在第3列的項目從SectionsFragment點擊。

然後,使用從How do disable paging by swiping with finger in ViewPager but still be able to swipe programmatically?接受的答案,我稍微調整了它,以便可以設置滑動的能力。

public class SetSwipeableViewPager extends ViewPager { 

boolean canSwipe = false; 

public SetSwipeableViewPager(Context context) { 
    super(context); 
} 

public SetSwipeableViewPager(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    if (!canSwipe) { 
     return false; 
    } 

    return super.onInterceptTouchEvent(event); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    if (!canSwipe) { 
     return false; 
    } 

    return super.onTouchEvent(event); 
} 

public void canSwipe(boolean swipeable) { 
    canSwipe = swipeable; 
} 
} 

有了這個,我們可以簡單地設置刷卡假,當我們在第一頁的能力,並啓用它,當我們離開。

首先,我們設置一個偵聽器來檢查我們何時選擇第一頁並禁用滑動。

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
       @Override 
       public void onPageSelected(int position) { 
        if (position == 0) 
         mViewPager.canSwipe(false); 
       } 
      }); 

當我們選擇在第三列表中的項目,我們創建DetailsFragment並把它放在DetailsFragmentContainer,當前項設置爲1,這樣的viewpager將顯示第二頁,然後重新啓用刷卡。

public void OnSection3Selected(long id) { 
    int parentItemId = ContractDetailsActivity.getItemId(id, getActivity()); 

    ... 

    ((DetailsFragmentContainer) fragment).createDetailsFragment(parentItemId); 
    mViewPager.setCurrentItem(1); 
    mViewPager.canSwipe(true); 
} 

我希望這對某人有幫助!

相關問題