FragmentPagerAdapter balayage pour afficher ListView 1/3 largeur de L'écran

EDIT: Voir ma réponse ci-dessous-->

je veux avoir une vue que lorsque glissé à droite, le listView est affiché. Très similaire à ce qui est mis en œuvre dans le nouveau Google Play Store (exemple d'image ci-dessous). Je pense que c'est un ViewPager mais j'ai essayé de le dupliquer sans l'emporter. Je pensais que c'était peut-être juste que l'attribut 'page listView' width était défini à un dp spécifique mais cela ne fonctionne pas. J'ai aussi essayé de modifier pakerfeldt de l' viewFlow et ne peux pas comprendre comment Google fait cela

Suis-je sur la bonne voie? Si quelqu'un a une idée pour dupliquer ceci, je l'apprécierais beaucoup. Je pense que cela peut devenir une nouvelle façon de montrer un aperçu de navigation sur les tablettes....? Le Code serait la meilleure solution. Je vous remercie!!

enter image description here

faites Glisser vers la droite:

enter image description here

Finnished de balayage; la mise en page affiche la liste et PART OF THE SECOND FRAGMENT (EXACTLY AS SHOWN) le fragment de la liste ne remplit pas l'écran:

enter image description here

Lorsque l'utilisateur effectue à gauche, la page principale s'affiche uniquement et si l'utilisateur effectue de nouveau à gauche la viewPager continue à la page suivante.

20
demandé sur Community 2012-03-14 03:35:51

6 réponses

Le code suivant atteint l'effet désiré:

PageAdapter:

@Override
public float getPageWidth(int position) {
if (position == 0) {
    return(0.5f);
} else {
    return (1.0f);       
}
20
répondu bludef 2013-06-18 04:01:58

lire votre question une dernière fois... assurez-vous également mis en place des dispositions spécifiques pour chaque taille de l'appareil. Dans vos screenshots, il semble que vous essayez d'exécuter ceci sur une tablette. Tu as les mêmes résultats sur un téléphone?

Configuration de votre Mise en page

assurez-vous que votre mise en page est similaire à ceci et a le ViewPager:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:background="@color/body_background">

<include layout="@layout/pagerbar" />
<include layout="@layout/colorstrip" />

<android.support.v4.view.ViewPager
        android:id="@+id/example_pager"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1" />

</LinearLayout>

mise en place de votre Activité

installez votre PagerAdapter dans votre "FragmentActivity "et assurez-vous de mettre en œuvre"OnPageChangeListener". Puis correctement configurer votre PagerAdapter dans votre onCreate.

public class Activity extends FragmentActivity 
             implements ViewPager.OnPageChangeListener { 
   ...

    public void onCreate(Bundle savedInstanceState) {

       PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager());
       pager = (ViewPager) findViewById(R.id.example_pager);

       pager.setAdapter(adapter);
       pager.setOnPageChangeListener(this);
       pager.setCurrentItem(MyFragment.PAGE_LEFT);

       ...
   }


   /* setup your PagerAdapter which extends FragmentPagerAdapter */

   static class PagerAdapter extends FragmentPagerAdapter {
       public static final int NUM_PAGES = 2;

       private MyFragment[] mFragments = new MyFragment[NUM_PAGES];

          public PagerAdapter(FragmentManager fragmentManager) {
           super(fragmentManager);
       }

       @Override
       public int getCount() {
           return NUM_PAGES;
       }

       @Override
       public Fragment getItem(int position) {
           if (mFragments[position] == null) {
               /* this calls the newInstance from when you setup the ListFragment */
               mFragments[position] = MyFragment.newInstance(position);
           }

           return mFragments[position];
       }
   }

 ...

configurer votre Fragment

lorsque vous configurez votre ListFragment actuel (vos listViews), vous pouvez créer plusieurs instances avec les arguments suivants:

  public static final int PAGE_LEFT = 0;
  public static final int PAGE_RIGHT = 1;

  static MyFragment newInstance(int num) {
       MyFragment fragment = new MyFragment();

       Bundle args = new Bundle();
       args.putInt("num", num);

       fragment.setArguments(args);
       return fragment;
   }

lorsque vous rechargez les listViews (comment décider d'implémenter ceci) , vous pouvez trouver quelle instance de fragment vous utilisez les arguments de la sorte:

    mNum = getArguments() != null ? getArguments().getInt("num") : 1;

si vous marchez à travers votre code, vous remarquerez qu'il passera à travers chaque instance donc le code ci-dessus n'est nécessaire que dans votre onCreate et une méthode de recharge peut ressembler à ceci:

private void reloadFromArguments() {
    /* mNum is a variable which was created for each instance in the onCreate */
    switch (mNum) {
        case PAGE_LEFT:
            /* maybe a query here would fit your needs? */
            break;

        case PAGE_RIGHT:
            /* maybe a query here would fit your needs? */
            break;
    }
}

peu de Sources qui peuvent vous aider avec des exemples que vous pourriez construire plutôt que de partir de zéro:

plus d'explications et d'exemples de récréation. http://blog.peterkuterna.net/2011/09/viewpager-meets-swipey-tabs.html qui est des références à: http://code.google.com/p/android-playground/

Plus d'infos et de bons liens. http://www.pushing-pixels.org/2012/03/16/responsive-mobile-design-on-android-from-view-pager-to-action-bar-tabs.html

si vous avez des questions plus spécifiques postez et je peux toujours éditer (mettre à jour) ma réponse pour adresser votre question. Bonne Chance! :)

2
répondu Codeversed 2012-04-10 02:27:42

Désolé pour le retard de mise à jour. J'ai mis en place cette de walkingice sur Gethub avec très peu de modifications. Il suffit d'utiliser une instruction conditionnelle pour Qu'un GestureDetector la glisse en vue uniquement lorsqu'un ID ViewPager de '0' est en vue. J'ai aussi ajouté une bascule dans ma barre D'action

1
répondu CelticParser 2012-06-12 13:50:51

ViewPager fait partie du Compatible Package

Si vous utilisez Fragments, vous pouvez utiliser ViewPager pour glisser entre eux.

Voici un exemple de la combinaison Fragments et ViewPager

Dans votre cas particulier, vous souhaitez créer un ListFragment puis de mettre en œuvre ViewPager.

0
répondu adneal 2012-03-14 00:24:05

je pense que vous êtes à la recherche pour mettre en œuvre une "navigation" à côté d'un standard ViewPager.

j'ai lu 2 articles différents sur ce modèle:

Le premier sur le modèle lui-même:

Android Motif de l'Interface utilisateur Émergents Motif de l'INTERFACE utilisateur de Navigation Latérale

le second sur une façon plus détaillée de qui le construire:

Cyril Mottier Fly-in menu #1 #2 #3

ce second article est référencé dans Android Ui Pattern blog.

0
répondu ol_v_er 2012-06-12 13:29:42

avec un petit truc, le comportement peut être atteint avec le scrollview-Behavior à l'intérieur du ViewPager. Si vous voulez seulement restreindre la zone du fragment le plus à gauche, vous pouvez restreindre les limites de défilement du ScrollView.

Dans votre cas: dans le onPageChangeListener de la ViewPager faire quelque chose comme ça:

@Override
public void onPageScrollStateChanged(int arg0) {
    restrictLeftScroll();
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
    restrictLeftScroll();
}

@Override
public void onPageSelected(int arg0) {

}

private void restrictLeftScroll() {

    if (display != null) {

        /* get display size */
        Point size = new Point();
        display.getSize(size);

        /* get desired Width of left fragment */
        int fragmentWidth = getResources().getDimensionPixelSize(R.dimen.category_fragment_width);

        if (mViewPager.getScrollX() < size.x - fragmentWidth) {
            mViewPager.scrollTo(size.x - fragmentWidth, mViewPager.getScrollY());
        }
    }
}

ce morceau de code a fonctionné pour moi sans problème. ;)

0
répondu Neonfly 2012-06-22 09:37:45