ViewPager setCurrentItem (pageId, true) НЕ плавает

Я собираю SDK 4.03, Samsung Infuse Android 2.2, библиотеку поддержки для Android 4 и используя ViewPager в своем приложении, фактический салфетки отлично работает, но когда я это делаю

viewPager.setCurrentItem(id); // , or viewPager.setCurrentItem(id, true); 

Он не сглаживает прокрутку, но мгновенно переключает представления. Хотя в документации четко указано, что это цель, устанавливающая второй аргумент true. Что с этим?

Solutions Collecting From Web of "ViewPager setCurrentItem (pageId, true) НЕ плавает"

Я исправил это, создав MyViewPager, который переопределяет ViewPager.mScroller, используя отражение.

 public class MyViewPager extends ViewPager { public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); setMyScroller(); } private void setMyScroller() { try { Class<?> viewpager = ViewPager.class; Field scroller = viewpager.getDeclaredField("mScroller"); scroller.setAccessible(true); scroller.set(this, new MyScroller(getContext())); } catch (Exception e) { e.printStackTrace(); } } public class MyScroller extends Scroller { public MyScroller(Context context) { super(context, new DecelerateInterpolator()); } @Override public void startScroll(int startX, int startY, int dx, int dy, int duration) { super.startScroll(startX, startY, dx, dy, 1000 /*1 secs*/); } } } 

Это то, что я сделал. Я перепробовал пакет-частный метод smoothScrollTo в ViewPager , поставив свой собственный подкласс в один и тот же пакет. Ему передавалось значение, равное нулю, что вызывает поведение привязки вместо гладкой прокрутки.

 package android.support.v4.view; import android.content.Context; import android.util.AttributeSet; public class MyViewPager extends ViewPager { public MyViewPager(Context context) { super(context); } public MyViewPager(Context context, AttributeSet attr) { super(context, attr); } void smoothScrollTo(int x, int y, int velocity) { super.smoothScrollTo(x, y, 1); } } 

Он отлично работал, если вы хотите, вы можете рассчитать и обеспечить фактическую скорость ISO всего 1.

Я вызвал функцию setCurrentItem в обработчике, и он отлично работал для меня.

 new Handler().post(new Runnable() { @Override public void run() { myViewPager.setCurrentItem(1, true); } }); 

Надеюсь это поможет.

Я знаю, что этот поток довольно старый, но это один из лучших результатов Google. Я уже много раз возвращался назад, чтобы решить эту проблему. Ни одно из решений выше не помогло мне вообще. Однако я нашел решение, которое работает для меня.

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

 mViewPager.setCurrentItem(intIndex, true); 

Изнутри моего OnClickEvent. По какой-то причине просмотрщик не нравится, поэтому вместо этого я сделал эту функцию. Он создает новый поток, который запускает runnable в потоке пользовательского интерфейса. Этот runnable – это то, что сообщает ViewPager прокрутку к определенному элементу.

 public static void scrollToIndex(int index) { final int intIndex = index; //We're going to make another thread to separate ourselves from whatever //thread we are in Thread sepThread = new Thread(new Runnable(){ public void run() { //Then, inside that thread, run a runnable on the ui thread. //MyActivity.getContext() is a static function that returns the //context of the activity. It's useful in a pinch. ((Activity)MyActivity.getContext()).runOnUiThread(new Runnable(){ @Override public void run() { if (mSlidingTabLayout != null) { //I'm using a tabstrip with this as well, make sure //the tabstrip is updated, or else it won't scroll //correctly if(mSlidingTabLayout.getTabStripChildCount() <= intIndex) mSlidingTabLayout.updateTabStrip(); //Inside this thread is where you call setCurrentItem mViewPager.setCurrentItem(intIndex, true); } } }); } }); sepThread.start(); } 

Надеюсь, я по крайней мере помог кому-то с этой проблемой. Удачи!

Редактирование: Оглядываясь на мой ответ, я уверен, что вы можете просто запустить поток ui, и он должен работать. Возьмите это с солью, хотя я еще не проверял ее.

У меня была та же проблема, но сегодня я нашел простое решение. Может быть, это поможет вам. Во-первых, давайте предположим, что у нас есть ViewPager, который заполняет весь экран. Чтобы переключаться между страницами, я создал собственный пользовательский вид с вкладками и поместил его поверх ViewPager. Нажатие на вкладку должно плавно прокручиваться на соответствующую страницу в ViewPager с помощью setCurrentItem (item, true) – но она прокручивается мгновенно без плавного! Затем я попытался добавить простую кнопку (не обычную) через обратный вызов ViewPager +:

 @Override public void onClick(View v) { viewPager.setCurrentItem(item, true); } 

После этого гладкий свиток смотрел на работу. Итак, решение было очень простым: внутри класса Button внутренний булевский onTouch (…) прослушиватель возвращает true, поэтому он всегда ПОТРЕБИТ события касания! Затем гладкая прокрутка начала работать для моего пользовательского представления вкладок, когда я заменил «return false» на «return true» во внутреннем булевом onTouch (…) прослушивателе.

Надеюсь, моя история успеха поможет вам.

ViewPager сильно изменился с 5 до 9. Некоторые из этих изменений могут быть связаны с вашей проблемой:

  • Исправлены ошибки для поведения пользовательского интерфейса в ViewPager (версии 5 и 6)
  • Исправлено множество ошибок для ViewPager (версия 9)

Давая понять, что ваш код должен работать нормально, я думаю, что ваша библиотека поддержки не обновляется. Попробуйте обновить библиотеку, если это не так.

Для тех, кто использует Xamarin (хотя этот подход применим и к Java), я могу предложить использовать следующий подход, основанный на ответе выше (ViewPager из Android Support Library v7 AppCompat 19.1.0):

 public void ScrollSmooth(int i) { var jClass = JNIEnv.GetObjectClass(_pager.Handle); var jMethod = JNIEnv.GetMethodID(jClass, "setCurrentItemInternal", "(IZZI)V"); JNIEnv.CallVoidMethod (_pager.Handle, jMethod, new JValue (i), new JValue (true), new JValue (false), new JValue (1)); } 

Он полагается на реализацию ViewPager из http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/support/v4/view/ViewPager.java

Попробуйте с этим кодом:

 viewPager.postDelayed(new Runnable() { @Override public void run() { viewPager.setCurrentItem(id, true); } }, 100);