簡體   English   中英

實現LoaderCallbacks的片段(片段內ViewPager的片段)的ListView <Cursor> 當我回到它是空的

[英]ListView of a Fragment (of a ViewPager inside a Fragment) that implements LoaderCallbacks<Cursor> is empty when I return back to it

返回到它時,包含ViewPager的Fragment內的ListView為空。 此ViewPager在Fragment內,因為我使用的是導航抽屜布局。 我將嘗試現在更詳細地解釋它:

我正在使用導航抽屜布局,因此使用了片段。 在主要活動的onCreate中,使用以下代碼行設置當前的Fragment:

@Override
protected void onCreate(Bundle savedInstanceState) {

    /* More code */

    currentFragment = new MainFragment();
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.layout_for_fragments, currentFragment).commit();
}

MainFragment類包含一個ViewPager,該ViewPager用onCreateView()中的以下代碼行初始化:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container, false);

    /* More code */

    ViewPager viewPager = (ViewPager) rootView.findViewById(R.id.main_view_pager);
    viewPager.setAdapter(new SimpleFragmentPagerAdapter(getActivity(), getActivity().getSupportFragmentManager()));

    /* Code for Tablayout */

    return rootView;
}

SimpleFragmentPagerAdapter類的片段之一是實現LoaderManager.LoaderCallbacks的片段。

public class ExpensesFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {

    private ExpenseCursorAdapter mExpenseCursorAdapter;

    private static final int EXPENSE_LOADER = 1;

    public ExpensesFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_expenses, container, false);

        ListView expensesListView = (ListView) rootView.findViewById(R.id.expenses_list_view);
        mExpenseCursorAdapter = new ExpenseCursorAdapter(getContext(), null);
        expensesListView.setAdapter(mExpenseCursorAdapter);

        getLoaderManager().initLoader(EXPENSE_LOADER, null, this);

        return rootView;
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return new CursorLoader(/* arguments */);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        mExpenseCursorAdapter.swapCursor(data);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        mExpenseCursorAdapter.swapCursor(null);
    }
}

第一次運行時,一切正常。 但是,如果單擊正在以這種方式實現的導航抽屜菜單,則ListView將變為空:

public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    int id = item.getItemId();

    if (id == R.id.nav_main) {

        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().remove(currentFragment).commit();

        currentFragment = new MainFragment();
        fragmentManager.beginTransaction().replace(R.id.layout_for_fragments, currentFragment).commit();

    } else if (id == R.id.nav_blank) {

        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction().remove(currentFragment).commit();

        currentFragment = new BlankFragment();
        fragmentManager.beginTransaction().replace(R.id.layout_for_fragments, currentFragment).commit();

    }

    drawer.closeDrawer(GravityCompat.START);
    return true;
}

旋轉設備時也存在此問題。 雖然有區別。 使用“導航抽屜”菜單時,不會調用LoaderManager.LoaderCallbacks的任何方法,但是當我旋轉設備時,將調用onLoadFinished。

無論如何,問題仍然存在。 有什么想法要解決嗎?

提前致謝。

我找到了解決方案!

基本上,我犯了兩個錯誤。 第一個是關於設備的旋轉。 旋轉設備時,Activity被銷毀,並再次調用onCreate。 在這種情況下,我不應該調用新的MainFragment()。 因此,在調用它之前,我先檢查一下saveInstanceState是否為null,如下所示:

if (savedInstanceState == null) {
    currentFragment = new MainFragment();
    FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().
            replace(R.id.layout_for_fragments, currentFragment).commit();
}

第二個是關於一個片段中的一個片段。 在這種情況下,我不能簡單地調用getSupportFragmentManager()。 我應該改為調用getChildFragmentManager(),就是這樣!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM