2016-10-17 2 views
3

Я хочу показать ViewPager со всеми днями недели с предварительным просмотром следующего и предыдущего пункта текущего. Я пробовал много решений, предлагаемых из stackoverflow, но ни один из них не работает. Я не хочу использовать фрагменты в ViewPager, поэтому я использовал PagerAdapter.ViewPager с просмотром элементов

Смотреть это изображение:

Days of the week ViewPager

Моя начальная точка:

  • activity_main.xml

    <TextView 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:gravity="center_horizontal" 
        android:text="Choose a day of the week:" /> 
    <android.support.v4.view.ViewPager 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content" 
        android:id="@+id/weekOfTheDayPager"/> 
    

  • MainActivity.java

    public class MainActivity extends AppCompatActivity { 
    
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        setUpAdapter(); 
    } 
    
    private void setUpAdapter() { 
        ViewPager _mViewPager = (ViewPager) findViewById(R.id.weekOfTheDayPager); 
    
        final String[] daysOfTheWeek = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; 
        final Context myContext = getBaseContext(); 
    
        _mViewPager.setAdapter(new PagerAdapter() { 
         @Override 
         public int getCount() { 
          return daysOfTheWeek.length; 
         } 
    
         @Override 
         public boolean isViewFromObject(View view, Object object) { 
          return view == object; 
         } 
    
         @Override 
         public Object instantiateItem(ViewGroup collection, int position) { 
          LayoutInflater inflater = LayoutInflater.from(myContext); 
          ViewGroup layout = (ViewGroup) inflater.inflate(R.layout.dayoftheweeklayout, collection, false); 
          ((TextView) layout.findViewById(R.id.dayOfTheWeekTextView)).setText(daysOfTheWeek[position]); 
          collection.addView(layout); 
          return layout; 
         } 
    
         @Override 
         public void destroyItem(ViewGroup collection, int position, Object view) { 
          collection.removeView((View) view); 
         } 
        }); 
    }} 
    

и, наконец, макет для элемента ViewPager:

  • dayoftheweeklayout.xml

    <?xml version="1.0" encoding="utf-8"?> 
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
        xmlns:tools="http://schemas.android.com/tools" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"> 
        <TextView 
         android:id="@+id/dayOfTheWeekTextView" 
         android:layout_width="wrap_content" 
         android:layout_height="wrap_content" 
         android:gravity="center" 
         android:text="Sunday" 
         android:layout_gravity="center_horizontal"/> 
    </FrameLayout> 
    

Любое предложение будет оценено по достоинству.

ответ

2

Итак, похоже, что вы хотите получить карусель .

Вот рецепт:

Во-первых, для того, чтобы показать страницы на стороне в ViewPager, вам необходимо предоставить некоторые отступы по бокам, а затем установите clipToPadding в false:

<android.support.v4.view.ViewPager 
     android:id="@+id/weekOfTheDayPager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:clipToPadding="false" 
     android:paddingEnd="@dimen/view_pager_padding" 
     android:paddingLeft="@dimen/view_pager_padding" 
     android:paddingRight="@dimen/view_pager_padding" 
     android:paddingStart="@dimen/view_pager_padding"/> 

Далее вам нужно переопределить getPageWidth в вашем PagerAdapter сказать ViewPager, что вы хотите, чтобы отобразить три страницы одновременно:

@Override 
    public float getPageWidth(int position) { 
     return 1F/3F; 
    } 

Тогда вы должны сказать ViewPager использовать пользовательские PageTransformer:

viewPager.setPageTransformer(false, new MyPageTransformer()); 

...

public static class MyPageTransformer implements ViewPager.PageTransformer { 

    private ArgbEvaluator mColorFade = new ArgbEvaluator(); 

    @Override 
    public void transformPage(View page, float position) { 

     // position is 0 when page is centered (current) 
     // -1 when page is all the way to the left 
     // +1 when page is all the way to right 

     // Here's an example of how you might morph the color 
     int color = mColorFade(Math.abs(position), Color.RED, Color.GRAY); 
     TextView tv = (TextView) page.findViewById(R.id.dayOfTheWeekTextView); 
     tv.setTextColor(color); 
    } 
} 

Там, наверное, что-то я забыл, но поиск SO для "андроида ViewPager карусели", и вы найдет ответ где-нибудь.

+0

Отличный ответ. Помог мне много. Благодаря! – blastervla

Смежные вопросы