【问题标题】:Android: call adapter directly in viewpager or call fragment per page?Android:直接在viewpager中调用适配器还是每页调用片段?
【发布时间】:2017-02-20 18:29:02
【问题描述】:

这个问题和我之前问过的this one有关。

我在 MainActivity.java 中创建了一个 viewpager,如下所示:

final ViewPager viewPager = (ViewPager) findViewById(R.id.vp_horizontal_ntb);
viewPager.setAdapter(new PagerAdapter() {
    @Override
    public int getCount() {
        return 5;
    }

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

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

    @Override
    public Object instantiateItem(final ViewGroup container, final int position) {
        if(position==0) { 
          // here is important!
        } else if(position == 1) {

        }
            ...
    } 
});

现在我想用一些 json RecyclerView 数据列表填充每个页面。(从网络获取 json)。

每个页面都有独立的数据列表。

我第一次为每个页面创建一个片段,如下所示:

if (position == 0) {
    final View view = LayoutInflater.from(getActivity().getBaseContext()).inflate(R.layout.fragment_tab0, null, false);
    tabFragment.MyAdapter adapter = new tabFragment.MyAdapter(getActivity().getSupportFragmentManager());
    adapter.addFragment(new tab0Fragment(), getResources().getString(R.string.tab0));
    container.addView(view);
    return view;
}

(所以对于 5 页,我有 5 个片段。

DEMO

但是当我滑动页面时,我的应用程序运行缓慢(滞后)。(点击按钮是正常的)

所以我尝试直接为每个页面编写一个适配器类,如下所示:

if (position == 0) {
    final View view = LayoutInflater.from(getBaseContext()).inflate(R.layout.item_vp_list, null, false));
    final RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.rv);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(getBaseContext(), LinearLayoutManager.VERTICAL, false));
    recyclerView.setAdapter(new Tab0RecycleAdapter());
    container.addView(view);
    return view;
 }

使用顶级代码,我的应用程序再次通过交换页面快速运行!

为每个页面创建片段重要吗?

为什么我必须使用片段?(因为一些程序员在 viewpager 中推荐了它)

我的方法(没有片段的第二种方法)对于真实的应用程序是 true 还是 false?

(我是菜鸟,这是我的第一个应用)

【问题讨论】:

    标签: android android-fragments android-viewpager


    【解决方案1】:
    • 现在我想用一些 json RecyclerView 数据列表填充每个页面。(从网络获取 json)。

    如果您在 UI 线程上执行此网络任务,它将阻塞并可能导致性能滞后。这可能是您的页面加载缓慢的原因。您应该在单独的线程上执行网络任务。

    • 所以我尝试像这样直接为每个页面编写一个适配器类

    每个回收站视图只需要一个适配器。如果您想在同一个适配器中支持多个视图,请覆盖 getItemViewType()。此处示例:https://stackoverflow.com/a/26245463/7395923

    • 为每个页面创建片段是否重要?
    • 为什么我必须使用片段? (因为一些程序员在 view pager 中推荐了它)

    可以使用没有片段的视图寻呼机。根据您之前的问题(链接在顶部),加载整个片段只是为了扩大视图似乎有点过头了。这是一个不带片段的视图寻呼机示例的链接:https://stackoverflow.com/a/18710626/7395923

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多