2016-05-03 8 views
0

Ich habe eine RecyclerView in einem Fragment, das in einem ViewPager in einer Aktivität gehostet wird. Es gibt zwei Aktivitäten in diesem Projekt MainActivity, die Elemente und DetailActivity auflistet, die Details zu dem in der ersten Aktivität ausgewählten Element anzeigen.ViewPager beginnt immer von 0 Position

Wenn ich von DetailsActivity zu MainActivity gehe, bin ich immer auf ViewPager Fragment Position 0, die das erste Fragment ist. Wie kann ich die Fragmentposition wiederherstellen?

Das Bundle ist immer leer, wenn ich von DetailActivity zu MainActivity gehe.

Hier ist die vollständige code of the app.

MainActivity

public class MainActivity extends AppCompatActivity { 

    private ViewPager mViewPager; 
    private static final String LOG = MainActivity.class.getSimpleName(); 
    private static final String VIEWPAGER_POSITION = "currentItem"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_titles); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     mViewPager = (ViewPager) findViewById(R.id.viewpager); 
     setupViewPager(mViewPager); 

     TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(mViewPager); 

     if (savedInstanceState != null) { 
      int pos = savedInstanceState.getInt(VIEWPAGER_POSITION, 0); 
      Log.d(LOG, "onCreate pos: " + pos); 
      mViewPager.setCurrentItem(pos); 
     } else { 
      Log.d(LOG, "onCreate savedInstanceState is null"); 
     } 
    } 

    private void setupViewPager(ViewPager viewPager) { 
     ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
     adapter.addFragment(new PopularFragment(), getResources().getString(R.string.popularity)); 
     adapter.addFragment(new RatingFragment(), getResources().getString(R.string.rating)); 
     adapter.addFragment(new FavoriteFragment().newInstance(), getResources().getString(R.string.favorite)); 
     viewPager.setAdapter(adapter); 
    } 

    public static class ViewPagerAdapter extends FragmentStatePagerAdapter { 
     private final List<Fragment> mFragmentList = new ArrayList<>(); 
     private final List<String> mFragmentTitleList = new ArrayList<>(); 

     public ViewPagerAdapter(FragmentManager manager) { 
      super(manager); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return mFragmentList.get(position); 
     } 

     @Override 
     public int getCount() { 
      return mFragmentList.size(); 
     } 

     public void addFragment(Fragment fragment, String title) { 
      mFragmentList.add(fragment); 
      mFragmentTitleList.add(title); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return mFragmentTitleList.get(position); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle bundle) { 
     super.onSaveInstanceState(bundle); 
     int pos = mViewPager.getCurrentItem(); 
     Log.d(LOG, "onSaveInstanceState pos: " + pos); 
     bundle.putInt(VIEWPAGER_POSITION, mViewPager.getCurrentItem()); 
    } 
} 

Dank.

Antwort

0

Ich bemerkte, dass, wenn ich den physischen Zurück-Knopf drückte, der ViewPager und RecyclerView richtig wiederhergestellt wurden. Also wollte ich eine Möglichkeit, up Tasten Verhalten wie onBackPressed() setzen. Antwort auf welche bereits in der Frage Make the “up” button behave like the “back” button on Android gebucht wurde.

Ich machte folgende Änderungen in DetailActivity und mein Code begann gut zu funktionieren.

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    if (id == android.R.id.home) { 
     onBackPressed(); 
     return true; 
    } 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
0

drehe ich, wenn Sie wieder von DetailActivity gehen, für Bundle suchen in

this.getIntent().getExtras().getInt(VIEWPAGER_POSITION, 0) 

UPDATE:

, wenn Sie Ihre aktuelle Position in beispielsweise SharedPreferences in onPause anhalten müssen und rufen Sie sie in onResume . wie:

private static String MY_PAGER_TAG = "tag_of_shared_vp_position"; 
    public void onPause(){ 
    super.onPause(); 
    int pos = getCurrentViewPagerPosition();//custom function, implement it by //yourself 
    SharedPreferences sharedPref = this.getPreferences(Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = sharedPref.edit(); 
    editor.putInt(MY_PAGER_TAG, pos); 
    editor.commit(); 
} 

public void onResume(){ 
    super.onResume(); 
    SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); 
    int pos = sharedPref.getInt(MY_PAGER_TAG,0); 
    setUpViewPagerOnPosition(pos); 
} 
+0

Ich verwende Intents nirgendwo. –

+0

Wie möchten Sie wissen, welches Fragment bei Ihrer Rückkehr geöffnet war? setze es auf Absicht –

+0

Ich möchte zurückgehen, wo ich von aka Zustand wiederherstellen kam. Für Intent muss ich ViewPager-Position von MainActivity zu DetailActivity und zurück zu MainActivity senden. Ist das richtig? Was macht nicht viel Sinn. –

Verwandte Themen