Android: Fragment y ViewPager comienza siempre en la primera posición

Utilizo el diseño Maestro / Detalle para mi aplicación de Android. Si hago clic en un elemento en el listview en mi ItemListActivity la posición se da a mi ItemDetailActivity. Ésta implementa ViewPager y FragmentStatePagerAdapter. Así que quiero pasar entre las vistas de detalle.

No sé cómo decirle al ViewPager que comience en la posición deseada (el entero de la ItemListActivity). Mi ViewPager comienza siempre en la posición 0 de mi lista sin importar a cuál he hecho clic en la lista.

Este es mi código:

ItemDetailActivity

public class ItemDetailActivity extends FragmentActivity { RSSFeed feed; int pos; private static List<Fragment> fragments; /** * The pager widget, which handles animation and allows swiping horizontally to access previous * and next wizard steps. */ private ViewPager mPager; /** * The pager adapter, which provides the pages to the view pager widget. */ private PagerAdapter mPagerAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // define layout of this activity setContentView(R.layout.activity_item_detail); // Get the feed object and the position from the Intent feed = (RSSFeed) getIntent().getExtras().get("feed"); //position of the clicked item from the list pos = getIntent().getExtras().getInt("pos"); //create all 20 ItemDetailFragments fragments = new ArrayList<Fragment>(); for(int i=0; i<=20; i++) fragments.add(ItemDetailFragment.create(i ,feed)); // Instantiate a ViewPager and a PagerAdapter. mPager = (ViewPager) findViewById(R.id.viewpager); mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); mPager.setAdapter(mPagerAdapter); mPager.setPageTransformer(true, new ZoomOutPageTransformer()); } @Override public void onBackPressed() { if (mPager.getCurrentItem() == 0) { // If the user is currently looking at the first step, allow the system to handle the // Back button. This calls finish() on this activity and pops the back stack. super.onBackPressed(); } else { // Otherwise, select the previous step. mPager.setCurrentItem(mPager.getCurrentItem() - 1); } } /** * A simple pager adapter that represents ItemDetailFragment objects, in * sequence. * * Creates a class that extends the FragmentStatePagerAdapter abstract class and * implements the getItem() method to supply instances of ScreenSlidePageFragment * as new pages. The pager adapter also requires that you implement the getCount() * method, which returns the amount of pages the adapter will create. */ private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { public ScreenSlidePagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int page_number) { return fragments.get(page_number); } @Override public int getCount() { //get the count of items in the feed return feed.getItemCount(); } } 

ItemDetailFragment:

 /** * A fragment representing a single Item detail screen. This fragment is either * contained in a {@link ItemListActivity} in two-pane mode (on tablets) or a * {@link ItemDetailActivity} on handsets. */ public class ItemDetailFragment extends Fragment { private static int fPos; static RSSFeed fFeed; private ShareActionProvider mShareActionProvider; Date pDate; /** * Mandatory empty constructor for the fragment manager to instantiate the * fragment (eg upon screen orientation changes). */ public ItemDetailFragment() { } /** * Factory method for this fragment class. Constructs a new fragment for the given page number. */ public static ItemDetailFragment create(int pos, RSSFeed feed) { ItemDetailFragment fragment = new ItemDetailFragment(); Bundle args = new Bundle(); args.putSerializable("feed", feed); args.putInt("pos", pos); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // show ActionBar setHasOptionsMenu(true); // get data from DetailActivity fFeed = (RSSFeed) getArguments().getSerializable("feed"); fPos = getArguments().getInt("pos"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // inflate the fragment with the custom detail fragment View view = inflater .inflate(R.layout.detail_fragment, container, false); return view; } @SuppressLint("SetJavaScriptEnabled") @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //here I put the data in my webview } 

activity_item_detail.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/lib/com.google.ads" android:id="@+id/main_item_layout" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <FrameLayout android:id="@+id/item_detail_container" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/adView" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" tools:context=".ItemDetailActivity" tools:ignore="MergeRootFrame" > </FrameLayout> 

Así que por el momento puedo sqipe a través de todos los elementos, pero siempre comienza en el primer elemento. Quiero iniciarlo en ese elemento en el que hice clic en mi listview.

¿Cómo puedo hacer esto?

2 Solutions collect form web for “Android: Fragment y ViewPager comienza siempre en la primera posición”

Según la documentación todo lo que necesitas hacer es usar

 mPager.setCurrentItem(pos); 

http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setCurrentItem(int)

De hecho, ya está utilizando el método que debe utilizar en su método onBackPressed() :

 mPager.setCurrentItem(mPager.getCurrentItem() - 1); 

Simplemente pase la posición inicial en un Bundle, luego llame a este método al configurarlo.

  • Android: EfficientAdapter con dos vistas diferentes
  • Elementos de lista personalizada que no responden a state_checked en el selector
  • Cómo obtener todos los elementos seleccionados de un ListView?
  • ¿Por qué el onItemClick de Android desea un largo para id de fila?
  • ¿Cómo llenar un ListView con una ArrayList?
  • ArrayAdapter personalizado setBackground en getView
  • Android ListView: scrollTo no funciona
  • Por el poder de MergeAdapter, StickyListHeaders y ListViewAnimations combinados Soy el capitán Android
  • JSON a ListView en Android con Gson
  • Cambiar la vista vacía de ListView
  • EnhancedListView con ExpandableListView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.