TabLayout中的片段视图尚未在活动创建时创建

时间:2015-07-14 19:45:57

标签: android android-fragments tabs android-tablayout

在我的许多应用中,我一直遇到一个反复出现的问题,并且一直在使用各种各样的工作来解决"它,但这次我已经拥有它,我想找出一个真正的解决方案。

我正在尝试使用两个标签构建标签式布局,其中每个标签显示应从互联网获取的一些数据。获得数据后,它会缓存在设备上,以便下次打开应用程序时立即恢复(然后在后台刷新)。

为此,我尝试加载缓存的数据并在第一个选项卡的RecyclerView中显示,我想在活动创建时执行此操作。在我这样做之前,我显然设置了所有标签布局的东西,以便正确加载标签。问题是它们不是,看起来构成标签页的片段还没有他们的观点,因此我无法访问它们上的RecyclerView。

这是我的活动代码:

public class MainActivity extends NetworkBusActivity
{
    // Views
    ViewPager tabPager;
    TabLayout tabLayout;

    // Tab pager adapter
    private ViewPagerAdapter adapter;

    // Fragment one and two
    private MenuFragment menuFragment;
    private OrderFragment orderFragment;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Create the views
        tabPager = (ViewPager) findViewById(R.id.tabPager);
        tabLayout = (TabLayout) findViewById(R.id.tabLayout);

        // Setup the tab layouts
        this.setupTabs();

        // Show cached data
        this.setCachedItems();

        // Start loading new data in background
        this.startLoading();
    }

    private void setupTabs()
    {       
        // Create Fragments
        menuFragment = new MenuFragment();
        orderFragment = new OrderFragment();

        // Setup adapter
        adapter = new ViewPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(menuFragment, getString(R.string.title_menu));
        adapter.addFragment(orderFragment, getString(R.string.title_orders));
        tabPager.setAdapter(adapter);

        // Setup the tab layout
        tabLayout.setupWithViewPager(tabPager);
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener()
        {
            // not shown
        });
    }    

    private void setCachedItems()
    {
        // Show cached data
        ArrayList<Item> items = Cache.menu.getItems();

        menuFragment.setItems(items);
    }

    private void startLoading()
    {
        // Start loading in background (not shown)
    }
}

应该很简单:创建视图,创建片段,设置标签布局,然后加载缓存的数据。

MenuFragment扩展了定义ItemListFragment方法的基类setItems

public class MenuFragment extends ItemListFragment
{
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflater.inflate(R.layout.tab_menu, container, false);
        return view;
    }

    @Override
    protected ItemListAdapter getAdapter(ArrayList<Item> items, boolean categorize)
    {
        return new MenuListAdapter(this, R.layout.row_item, items, categorize);
    }
}

public abstract class ItemListFragment extends Fragment
{
    private RecyclerView recycler;

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState)
    {
        super.onViewCreated(view, savedInstanceState);

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
        recycler = (RecyclerView) view;
        recycler.setLayoutManager(linearLayoutManager);
        recycler.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
    }

    public void setItems(ArrayList<Item> items)
    {
        recycler.setAdapter(getAdapter(items, true));
    }

    protected abstract ItemListAdapter getAdapter(ArrayList<Item> items, boolean categorize);
}

再次直截了当:在onCreateView中创建视图,然后在onViewCreated中获取RecyclerView,最后使用适配器设置项目。

问题很简单:MainActivity中的方法setCachedItems在之前称为,在片段中调用onCreateViewonViewCreated方法。因此,RecyclerView为空,我无法设置其适配器。即使我在创建一个新的Fragments实例并在调用该方法之前将它们添加到一个功能性的TabLayout中。

在创建视图之前似乎有一些延迟,但我需要在创建活动时设置项目。

我哪里出错,我该如何解决?

1 个答案:

答案 0 :(得分:0)

在片段的onViewCreated中执行此操作

((MainActivity)getActivity).setCachedData().....

而不是创建活动