2013-08-06 47 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); 
} 

我希望这对某人有帮助!

相关问题