android - Litho、ViewPager 和选项卡。如何使用 Litho 加载多个 Tab 的布局?

标签 android litho

我正在尝试像这样使用 Tabs 实现 ViewPager:

snapshot

fragment 的布局是用 Facebook 的 Litho 呈现的,但这里的问题是只加载了第一个项目,在本例中为“Look”。 看代码:

主 Activity :

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);
        }
    });
}
}

并且,为简单起见,我们假设所有 fragment (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 时加载五个 fragment 的 View ,但只显示第一个 fragment ,无论哪个 fragment 。我究竟做错了什么?我怎么能得到它?

编辑:

如果我将 mViewPager.setOffscreenPageLimit(4) 更改为 (0),我会得到加载所有 View ,但是一个接一个,并且每次加载它们'专注于焦点,这是不希望的。我想要得到的是五个页面一次加载,并且只加载一次。

最佳答案

调用这个

public static boolean incrementalMountUsesLocalVisibleBounds = false;

在 viewPager 中填充 View 之前。这应该可以解决问题。

工作原理

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 工作。

关于android - Litho、ViewPager 和选项卡。如何使用 Litho 加载多个 Tab 的布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47736805/

相关文章:

java - 按钮单击事件以打开互联网上的书签

android - 如果在 CursorLoader 注册 ContentObserver 之前调用 notifyChange(),CursorLoader 不会刷新

android - 对话框布局显示不正确

java - SavedState ViewModel 使用 SavedStateViewModelFactory

android - FB 光刻 : How to set custom font for Text

android - 将 MountSpec 组件与 "wrap_content" View 一起使用 - 如何实现 onMeasure()

android - 如何处理 RecyclerCollectionComponent 的项目之间的空间

android - ProjectConfigurationException 如何解决这些?