FragmentPagerAdapter Проведите пальцем, чтобы отобразить ListView 1/3 ширины экрана - PullRequest
20 голосов
/ 14 марта 2012

РЕДАКТИРОВАТЬ: Смотрите мой ответ ниже ->

Я хочу, чтобы при просмотре вправо отображался список. Очень похоже на то, что реализовано в новом магазине Google Play (пример изображения ниже). Я думаю, что это ViewPager, но я попытался дублировать его без преобладания. Я думал, что это может быть просто, что атрибут ширины 'listView Page' был установлен на определенный dp, но это не работает. Я также попытался изменить pakerfeldt viewFlow и не могу понять, как Google делает это

Я на правильном пути? Если у кого-то есть идея, как продублировать это, я был бы очень признателен. Я думаю, что это может стать популярным новым способом отображения вида навигации на планшетах ....? Код был бы лучшим подспорьем. Спасибо !!

enter image description here

Проведите пальцем вправо:

enter image description here

Законченный удар; макет показывает список и ЧАСТЬ ВТОРОГО ФРАГМЕНТА (ТОЧНО КАК ПОКАЗАНО) Фрагмент списка не заполняет экран:

enter image description here

Когда пользователь проводит пальцем влево, отображается только главная страница, а если пользователь снова проводит пальцем влево, viewPager переходит к следующей странице.

Ответы [ 6 ]

20 голосов
/ 21 сентября 2012

Следующий код достигает желаемого эффекта:

В PageAdapter:

@Override
public float getPageWidth(int position) {
if (position == 0) {
    return(0.5f);
} else {
    return (1.0f);       
}
2 голосов
/ 10 апреля 2012

Читая ваш вопрос в последний раз ... убедитесь, что вы также настроили конкретные макеты для каждого устройства размера.На ваших скриншотах похоже, что вы пытаетесь запустить это на планшете.Получаете ли вы те же результаты на телефоне?

Настройка макета

Убедитесь, что ваш макет похож на него и имеет 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>

Настройка вашей активности

Настройте свой PagerAdapter в «FragmentActivity» и убедитесь, что вы реализуете «OnPageChangeListener».Затем правильно настройте свой PagerAdapter в 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];
       }
   }

 ...

Настройка вашего фрагмента

Когда вы настраиваете фактический ListFragment (ваши listViews), вы можете создавать несколько экземпляров с помощьюаргументы наподобие следующего:

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

Когда вы перезагружаете listViews (как только вы решите реализовать это), вы можете выяснить, на каком экземпляре фрагмента вы находитесь, используя аргументы, например:

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

Если вы пошагово просматриваете свой код, вы заметите, что он будет проходить через каждый экземпляр, поэтому приведенный выше код необходим только в вашем onCreate , а метод перезагрузки может выглядеть следующим образом:

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

Несколько источников, которые могут помочь вам с примерами, которые вы могли бы построить, а не начинать с нуля:

Больше объяснений и примеров с игровой площадки.http://blog.peterkuterna.net/2011/09/viewpager-meets-swipey-tabs.html, который ссылается на: http://code.google.com/p/android-playground/

Дополнительная информация и некоторые хорошие связи.http://www.pushing -pixels.org / 2012/03/16 / отзывчивый-мобильный-дизайн-на-андроиде-от-пейджер-до-действия-bar-tabs.html

Если у вас есть более конкретные вопросы, пост, и я всегда могу отредактировать (обновить) мой ответ, чтобы ответить на ваши вопросы.Удачи!:)

1 голос
/ 12 июня 2012

Извините за позднее обновление. Я реализовал это из walkice на Gethub с очень небольшими изменениями. Просто используйте условный оператор для GestureDetector, чтобы смахнуть его в поле зрения только тогда, когда отображается ViewPager id '0'. Я также добавил переключатель в моем ActionBar

0 голосов
/ 22 июня 2012

С небольшой хитростью, поведение может быть достигнуто с помощью ScrollView-Behavior внутри ViewPager. Если вы хотите ограничить только область самого левого фрагмента, вы можете ограничить пределы прокрутки ScrollView.

В вашем случае: в onPageChangeListener ViewPager сделайте что-то подобное:

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

Этот кусок кода работал для меня без проблем. ;)

0 голосов
/ 12 июня 2012

Я думаю, что вы хотите реализовать "боковую навигацию" рядом со стандартным ViewPager .

Я прочитал 2 разные статьи по этому шаблону:

Первый на самом шаблоне:

Шаблон пользовательского интерфейса Android, появляющийся шаблон пользовательского интерфейса - боковая навигация

Второй по более подробному способу того, кто его построит:

Кирил Мотье Fly-in меню приложения # 1 # 2 # 3

Эта вторая статья упоминается в блоге Android Ui Pattern.

0 голосов
/ 14 марта 2012

ViewPager является частью Совместимого пакета

Если вы используете Фрагменты , то вы можете использовать ViewPager для перемещения между ними.

Вот пример объединения Fragments и ViewPager

В вашем конкретном случае вы хотели бы создать ListFragment, а затем реализовать ViewPager.

...