Litho, ViewPager и Tabs. Как загрузить несколько макетов Tab с помощью Litho?

Я пытаюсь реализовать ViewPager с вкладками просто так:

снимок

Макеты фрагмента отображаются с помощью Litho в Facebook, но проблема здесь в том, что загружается только первый элемент, в данном случае "Look". Смотрите код:

MainActivity:

public class MainActivity extends AppCompatActivity {

private FragmentPagerAdapter mPagerAdapter;
private ViewPager mViewPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
        private final Fragment[] mFragments = new Fragment[]{
                new Look(),
                new Chat(),
                new Flirt(),
                new Friends(),
                new Me(),
        };

        @Override
        public Fragment getItem(int position) {
            return mFragments[position];
        }

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

    };
    mViewPager = (ViewPager) findViewById(R.id.container);
    mViewPager.setAdapter(mPagerAdapter);
    mViewPager.setOffscreenPageLimit(3);
    TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
    tabLayout.setTabTextColors(Color.parseColor("#616161"), Color.parseColor("#ffffff"));
    tabLayout.setupWithViewPager(mViewPager);
    tabLayout.getTabAt(0).setText("LOOK");
    tabLayout.getTabAt(1).setText("CHAT");
    tabLayout.getTabAt(2).setText("FLIRT");
    tabLayout.getTabAt(3).setText("ADD");
    tabLayout.getTabAt(4).setText("ME");
    findViewById(R.id.options).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i = new Intent(MainActivity.this, Options.class);
            startActivity(i);
        }
    });
}
}

И, ради простоты, давайте предположим, что все фрагменты (Look, Chat, ...) имеют один и тот же код внутри метода onCreateView:

public class Flirt extends Fragment {

public Flirt() {
}

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    final ComponentContext contex = new ComponentContext(getContext());
    final Component component = Text.create(contex)
            .text("Hello World")
            .textSizeDip(50)
            .textColor(Color.GRAY)
            .build();
    return LithoView.create(contex, component);
}
}

Ожидается, что представление пяти фрагментов будет загружено при создании MainActivity, но отображается только первый, какой бы он ни был. Что я делаю неправильно? Как я мог получить это?

РЕДАКТИРОВАТЬ:

Если я изменю mViewPager.setOffscreenPageLimit(4) в (0)Я получаю, что все представления загружаются, но по одному, и они загружаются каждый раз, когда они находятся в фокусе, что нежелательно. То, что я пытаюсь получить, - это то, что пять страниц загружаются одновременно и только один раз.

1 ответ

Решение

Позвони

public static boolean incrementalMountUsesLocalVisibleBounds = false;

перед заполнением просмотров в viewPager. Это должно сделать свое дело.

Как это устроено

в классе IncrementalMountHelper у нас есть следующий кусок кода:

// ViewPager does not give its child views any callbacks when it moves content onto the screen,
// so we need to attach a listener to give us the information that we require.
ViewParent viewParent = lithoView.getParent();
while (viewParent != null) {
  if (ComponentsConfiguration.incrementalMountUsesLocalVisibleBounds
      && viewParent instanceof ViewPager) {
    final ViewPager viewPager = (ViewPager) viewParent;
    final IncrementalMountHelper.ViewPagerListener viewPagerListener =
        new ViewPagerListener(mComponentTree, viewPager);
    ViewCompat.postOnAnimation(
        viewPager,
        new Runnable() {
          @Override
          public void run() {
            viewPager.addOnPageChangeListener(viewPagerListener);
          }
        });
    mViewPagerListeners.add(viewPagerListener);
  }

  if (viewParent instanceof LithoView && ((LithoView) viewParent).doesOwnIncrementalMount()) {
    lithoView.setDoesOwnIncrementalMount(true);
  }

  viewParent = viewParent.getParent();
}

viewPagerListener здесь отвечает за звонки componentTree.incrementalMountComponent();

Это не называют, потому что ComponentsConfiguration.incrementalMountUsesLocalVisibleBounds по умолчанию false, и вы должны установить его в true.

Я еще не знаю, какими будут все остальные эффекты, когда вы установите его в true, но, установив его в true, ваш ViewPager будет работать.

Другие вопросы по тегам