Android ViewPager при считывании на последнем экране
У меня возникли проблемы с тем, как захватить событие салфетки на последней странице пейджера просмотра.
в основном требование заключается в том, что, когда пользователь находится на последней странице, и они пытаются провести, чтобы добраться до следующей страницы, действие должно закрыться.
Я пробовал делать это onPageScrolled, но я не могу различать левый или правый свайп, когда там. Когда на последней странице пользователь должен сохранить функциональность для перехода к предыдущей страница.
таким образом, в основном дело в
When on last page
if swipe prev (do normal behaviour)
if swipe next (finish activity)
может ли кто - нибудь предоставить какие-либо предложения? Спасибо
6 ответов
вы должны включить поддельную пустую страницу в свой ViewPager
, когда пользователь проводит фактическую последнюю страницу, дело доходит до этого поддельного. Когда этот поддельный виден, закончите Activity
.
вы должны попробовать этот способ, если он не работает, я могу дать вам пример кода.
вот рабочее решение!!
переменные
....
private boolean isLastPageSwiped;
private int counterPageScroll;
....
внутри onPageScrolled of ViewPager
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//Here 6 is last position
if (position == 6 && positionOffset == 0 && !isLastPageSwiped){
if(counterPageScroll != 0){
isLastPageSwiped=true;
//Next Activity here
}
counterPageScroll++;
}else{
counterPageScroll=0;
}
}
Я, вероятно, действительно опаздываю, но тогда это может помочь кому-то другому. Я получил фрагмент из вопроса о stackoverflow, где я просто немного настраиваю код.
ответ здесь.
ViewPager.OnPageChangeListener pagerListener = new ViewPager.OnPageChangeListener() {
boolean lastPageChange = false;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels){
int lastIdx = mPgScreenAdapter.getCount() - 1;
Log.d(TAG, "pos:" + position);
if(lastPageChange && position == lastIdx) {}
}
@Override
public void onPageSelected( int i) {
pgText.setCurrentItem(i/2);
}
@Override
public void onPageScrollStateChanged(int state) {
int lastIdx = mPgScreenAdapter.getCount() - 1;
int curItem = pgScreen.getCurrentItem();
if(curItem==lastIdx && state==1){
lastPageChange = true;
// i put this here since onPageScroll gets called a couple of times.
finish();
}else {
lastPageChange = false;
}
}
};
надеюсь, вы получили ответ, я столкнулся с той же проблемой, и это то, что я сделал:
Если вы используете viewpager и activity с расширением класса FragmentStatePagerAdapter
можно использовать getItem(int position)
метод для проверки, если вы достигли последней страницы. Это также, если вы объявили NUM_PAGES
и вы можете использовать его, чтобы обнаружить, что пользователь достиг последней страницы.
Я также попытался найти решение. Вот рабочий код.Надеюсь, это поможет кому-то еще: -
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
if (state == ViewPager.SCROLL_STATE_IDLE) {
int curr = pager.getCurrentItem();
int lastReal = pager.getAdapter().getCount() - 1;
if (curr < lastReal) {
counter = 0;
} else if (curr == lastReal) {
counter++;
if (counter == 2) {
pager.setOffscreenPageLimit(0);
pager.setCurrentItem(0, false);
counter = 0;
}
}
}
}
});
pagerIndicator.setViewPager(pager);
я использовал счетчик как глобальную переменную.
спасибо!
Я создал абстрактный слушатель, основанный на решениях здесь. Я хотел что-то сделать, когда проводил прямо на последней странице или слева на первой странице.
import android.support.v4.view.ViewPager;
abstract class PageChangeToUnavailablePageListener implements ViewPager.OnPageChangeListener {
private int finalPageIndex;
private boolean finalPageVisible = false;
private boolean firstPageVisible = true;
private int lastScrollState = 0;
abstract void onUnavailablePageChangeOnLastPage();
abstract void onUnavailablePageChangeOnFirstPage();
public PageChangeToUnavailablePageListener(int finalPageIndex) {
this.finalPageIndex = finalPageIndex;
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int i) {
firstPageVisible = (i == 0);
finalPageVisible = (i == finalPageIndex);
}
@Override
public void onPageScrollStateChanged(int state) {
// The normal state sequence for changing pages is
// DRAGGING (user starts drag), SETTLING (next page is chosen), IDLE (animation is complete).
// No next page is chosen when dragging right on last page, or left on first page.
// In this case the SETTLING state is missing and the sequence is (DRAGGING, IDLE).
if (lastScrollState == ViewPager.SCROLL_STATE_DRAGGING && state == ViewPager.SCROLL_STATE_IDLE) {
// The user scrolled to an unavailable page.
if (finalPageVisible) {
onUnavailablePageChangeOnLastPage();
} else if (firstPageVisible) {
onUnavailablePageChangeOnFirstPage();
}
}
lastScrollState = state;
}
}