2017-05-19 14 views
0

ViewPagerを含むフラグメントのリストビューは、戻ったときに空です。このViewPagerは、ナビゲーション・ドロワー・レイアウトを使用しているため、フラグメント内にあります。私は今、より詳細にそれを説明してみましょう:LoaderCallbacksを実装するフラグメントビューリストのListView

私はナビゲーションドロワーのレイアウトを使用して、結果的に、フラグメントを使用しています。

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

@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クラスはonCreateViewのコードのこれらの行()で初期化さViewPagerが含ま:メインアクティビティでのonCreateで、Iは、これらのコード行と現行断片を設定します 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; 
} 

問題も存在します。しかし、違いがあります。 Navigation Drawerメニューを使用すると、LoaderManager.LoaderCallbacksのメソッドは呼び出されませんが、デバイスを回転するとonLoadFinishedが呼び出されます。

とにかく、問題は解決しません。任意のideiasどのようにそれを解決するには?

ありがとうございます。

答えて

0

私は解決策を見つけました!

基本的に、私は2つの間違いを犯しました。 最初のものはデバイスの回転です。 デバイスが回転すると、アクティビティは破棄され、再びonCreateが呼び出されます。この場合、私は新しいMainFragment()を呼び出すべきではありません。したがって、私が呼び出す前に、savedInstanceStateがnullの場合は、次のようにチェックします。

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

2番目はフラグメント内のフラグメントについてです。この場合、単にgetSupportFragmentManager()を呼び出すことはできません。代わりにgetChildFragmentManager()を呼び出す必要があります。

関連する問題