Реализация пейджера внутреннего просмотра - PullRequest
0 голосов
/ 11 мая 2018

Я реализовал один вид пейджер внутри другого.Требовалось наличие вкладок на родительском пейджере и показ его элемента на дочернем пейджере.Например, пейджер родительского просмотра имеет две вкладки (эпизод, видео), и у нас есть количество эпизодов и видео (пейджер дочернего просмотра), которые необходимо отобразить на соответствующих вкладках.Проблема в том, что когда я провожу пальцем по краям экрана, он меняет вкладку, даже если на текущей вкладке есть больше элементов для загрузки.Но он прекрасно работает, когда я провожу пальцем по центру экрана, и показывает следующий эпизод, когда я нахожусь на вкладке эпизода.

Вот код:

public class ParentPagerAdapter extends FragmentStatePagerAdapter {

  private List<String> tabList;
  private boolean isPilot;
  private ArrayList<?extends IVideoModel> videoList;
  private ArrayList<?extends IEpisodeAndVideoModel> episodeList;

  public ParentPagerAdapter(FragmentManager fm, List<String> tabList,
      ArrayList<?extends IEpisodeModel> episodeList, ArrayList<?extends IVideoModel>
      videoList) {
    super(fm);
    this.episodeList = episodeList;
    this.videoList = videoList;
    this.tabList = tabList;
  }

  @Override
  public Fragment getItem(int position) {
    Fragment fragment;
    Bundle bundle = new Bundle();
    if(tabList.get(position).contains(VIDEOS_TAB_TITLE)){
      fragment = new VideoTabFragment();
      return fragment;
    }else if(tabList.get(position).contains(EPISODES_TAB_TITLE)){
      fragment = new EpisodeTabFragment();
      return fragment;
    }
    return null;
  }

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

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

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

Детский вид Пейджер 1:

public class ProjectVideoPagerAdapter extends PagerAdapter {
  public final String TAG = ProjectVideoPagerAdapter.class.getCanonicalName();
  private Context mContext;
  private LayoutInflater mLayoutInflator;
  private RowProjectLandingPagerItemBinding itemBinding;
  private List<? extends IVideoModel> projectVideoList;

  public ProjectVideoPagerAdapter(Context context, List<? extends IVideoModel> projectVideoList) {
    mContext = context;
    this.projectVideoList = projectVideoList;
    mLayoutInflator = ((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE));
  }

  @Override
  public Object instantiateItem(ViewGroup container, int position) {
    debugLog("Entering instantiateItem with position = " + position);
    itemBinding =
        DataBindingUtil.inflate(mLayoutInflator, R.layout.row_project_landing_pager_item, null,
            false);
    if (projectVideoList == null) return null;

    container.addView(itemBinding.getRoot());
    debugLog("Exiting instantiateItem()");
    return itemBinding.getRoot();
  }

  @Override
  public int getCount() {
    if (projectVideoList != null && !projectVideoList.isEmpty()) return projectVideoList.size();
    return 0;
  }

  @Override
  public boolean isViewFromObject(View view, Object object) {
    return view == (object);
  }

  @Override
  public void destroyItem(ViewGroup container, int position, Object object) {
    ((ViewPager)container).removeView((View)object);
    //super.destroyItem(container, position, object);
  }
}

Детский пейджер 2:

public class ProjectVideoPagerAdapter extends PagerAdapter {
  public final String TAG = ProjectVideoPagerAdapter.class.getCanonicalName();
  private Context mContext;
  private LayoutInflater mLayoutInflator;
  private RowProjectLandingPagerItemBinding itemBinding;
  private List<? extends IEpisodeModel> projectEpisodeList;

  public ProjectVideoPagerAdapter(Context context, List<? extends IEpisodeModel> projectList) {
    mContext = context;
    this.projectEpisodeList = projectList;
    mLayoutInflator = ((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE));
  }

  @Override
  public Object instantiateItem(ViewGroup container, int position) {
    debugLog("Entering instantiateItem with position = " + position);
    itemBinding =
        DataBindingUtil.inflate(mLayoutInflator, R.layout.row_project_landing_pager_item, null,
            false);
    if (projectEpisodeList == null) return null;

    container.addView(itemBinding.getRoot());
    debugLog("Exiting instantiateItem()");
    return itemBinding.getRoot();
  }

  @Override
  public int getCount() {
    if (projectEpisodeList != null && !projectEpisodeList.isEmpty()) return projectEpisodeList.size();
    return 0;
  }

  @Override
  public boolean isViewFromObject(View view, Object object) {
    return view == (object);
  }

  @Override
  public void destroyItem(ViewGroup container, int position, Object object) {
    ((ViewPager)container).removeView((View)object);
    //super.destroyItem(container, position, object);
  }
}

1 Ответ

0 голосов
/ 11 мая 2018

При использовании пейджера внутреннего представления вы должны использовать «childfragmentmanager» вместо «fragmanager». Работает нормально.

...