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

EDIT: см. мой ответ ниже -- >

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

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

введите здесь описание изображения

Проведите вправо:

введите здесь описание изображения

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

введите здесь описание изображения

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


person Community    schedule 13.03.2012    source источник
comment
Просто выдвижной ящик? developer.android.com/reference/android/widget/   -  person Blundell    schedule 14.03.2012
comment
@Blundell Даже нет - см. Новый рынок - AKA Play Store. спасибо   -  person    schedule 14.03.2012
comment
Когда я работал с Fragment Pager, я, кажется, помню код Google, который предполагал, что все экраны будут одинакового размера. Я думаю, что альтернативным подходом к этому было бы рассмотрение фрагмента списка (0 выше) и страниц (1 и 2 выше) как отдельных отображаемых элементов. Когда пейджер просмотра находится на первом элементе (1) и получает жест смахивания влево, используйте переход фрагмента, чтобы изменить макет представления, чтобы он был похож на ваше окончательное изображение. Это должно быть возможно путем настройки средств жестов в родительской активности.   -  person Nick Campion    schedule 12.06.2012
comment
@Nick Campion СМОТРЕТЬ МОЙ ОТВЕТ ЗДЕСЬ Это то, что я использую и отлично работает.   -  person    schedule 13.06.2012


Ответы (6)


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

In PageAdapter :

@Override
public float getPageWidth(int position) {
if (position == 0) {
    return(0.5f);
} else {
    return (1.0f);       
}
person bludef    schedule 20.09.2012
comment
Здорово! Не может быть простого метода, чем этот :) - person intrepidkarthi; 08.11.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/responsive-mobile-design-on-android-from-view-pager-to-action-bar-tabs.html

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

person Codeversed    schedule 10.04.2012

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

person Community    schedule 12.06.2012
comment
да, это работает... немного работает только с одним фрагментом разной ширины:/ - person skyman; 17.06.2012
comment
@skyma не уверен, что ты имеешь в виду ?? Его полностью настраиваемый. - person ; 18.06.2012
comment
У меня нет времени запускать код, но похоже, что у меня может быть только одна страница с разной шириной, и можно использовать что-то вроде ViewPager (просмотр с помощью адаптера):/ - person skyman; 20.06.2012
comment
@skyman У вас может быть столько страниц, сколько вам нравится, и они могут быть расположены так, как вам нравится. Вот пример работы - person ; 20.06.2012
comment
хорошо ... но как я могу иметь несколько страниц не полной ширины (также называемых боковыми панелями)? - person skyman; 21.06.2012
comment
@Andaero Где вы добавили это условие? - person intrepidkarthi; 14.09.2012

ViewPager является частью Пакет совместимости

Если вы используете фрагменты, вы можете использовать ViewPager для переключения между их.

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

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

person adneal    schedule 14.03.2012
comment
Thnx, но это то, с чем я тоже играл. Я не могу понять, как сделать так, чтобы фрагмент 0 (или первая страница) не занимал весь экран. Пожалуйста, посмотрите приложение Play Store. - person ; 14.03.2012
comment
Если у вас возникли проблемы с макетом, измените его. Вы должны надуть один для своего Fragment. - person adneal; 14.03.2012
comment
А, подожди. Я думаю, что вы говорите о разнице между Fragments. Если это так, используйте setPageMargin() с ViewPager, чтобы создать пространство между каждым Fragment. - person adneal; 14.03.2012

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

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

Первый на самой выкройке:

Шаблон нового пользовательского интерфейса Android — боковая навигация

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

Меню приложения Cyril Mottier Fly-in #1 #2 #3< /а>

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

person ol_v_er    schedule 12.06.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());
        }
    }
}

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

person Neonfly    schedule 22.06.2012
comment
У меня работало без проблем. Получил тот же результат, что и в плеймаркете. Это работает только для самого левого фрагмента. В событиях onPageScroll вы можете управлять поведением расширенного ViewPager. Используйте мою функцию restrictLeftScroll(), чтобы получить то же самое, что и в игровом магазине. - person Neonfly; 29.10.2012