Мне удалось создать простое решение, используя ListView
, и прокрутить его до ближайшего положения, когда прокрутка остановлена. Просто создайте ListView
и добавьте OnScrollListener
:
РЕДАКТИРОВАТЬ: Я обновил код для лучшей реализации
lv.setOnScrollListener(new OnScrollListener(){
private boolean handleScrollChange = true;
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
public void onScrollStateChanged(final AbsListView view, int scrollState) {
if (!handleScrollChange)
return;
if(scrollState == OnScrollListener.SCROLL_STATE_IDLE){
View centerView;
if (view.getLastVisiblePosition() - view.getFirstVisiblePosition() > 1) { //if shows more than 2 items, display the middle one
centerView = view.getChildAt( Math.round((view.getChildCount())/2));
}
else { //shows 2 items, check which one is closer to the middle
View bottomview = view.getChildAt(view.getChildCount()-1);
if (bottomview.getTop() < bottomview.getHeight() / 2) {
centerView = bottomview;
}
else {
centerView = view.getChildAt(0);
}
}
int wantedOffset = (view.getHeight() - centerView.getHeight()) / 2 ;
final int scrollby = (int) centerView.getY() - wantedOffset;
//we want to prevent the smoothScroll from calling this function again
handleScrollChange = false;
view.post(new Runnable() {
@Override
public void run() {
view.smoothScrollBy(scrollby,300);
view.postDelayed(new Runnable() {
@Override
public void run() {
handleScrollChange = true;
}
}, 1000);
}
});
}
}
});