0

我在我的许多应用程序中不断遇到一个反复出现的问题,并且一直在使用各种变通方法来“解决”它,但这次我已经遇到了,我想找出一个真正的解决方案。

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

为此,我试图加载缓存的数据并将其显示在第一个选项卡的 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,然后在 中获取 RecyclerView onViewCreated,最后使用适配器设置项目。

问题很简单:setCachedItemsMainActivity 中的方法在 Fragments 中的or方法被调用之前被调用。因此,它是空的,我不能设置它的适配器。即使我在调用该方法之前创建了 Fragments 的新实例并将它们添加到功能 TabLayout 中。onCreateViewonViewCreatedRecyclerView

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

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

4

1 回答 1

0

在片段的 onViewCreated 中执行此操作

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

而不是创建活动

于 2015-07-14T19:52:26.290 回答