Skip to content

Instantly share code, notes, and snippets.

@ekzee
Last active August 29, 2015 14:08
Show Gist options
  • Save ekzee/49e59dc77ff12bdbb8e6 to your computer and use it in GitHub Desktop.
Save ekzee/49e59dc77ff12bdbb8e6 to your computer and use it in GitHub Desktop.
simple implementation of quick return pattern for android listview
public class QuickReturn implements AbsListView.OnScrollListener {
public static QuickReturn apply(ListView listView, View targetView){
return new QuickReturn(listView, targetView);
}
private final ListView mListView;
private final View mTargetView;
private AbsListView.OnScrollListener mOnScrollListener;
private int mLastFirstVisibleItem;
private int mLastTop;
private int mLastHeight;
private QuickReturn(ListView listView, View targetView) {
mListView = listView;
mTargetView = targetView;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mListView.setOnScrollListener(this);
}
}
public void withOnScrollListener(AbsListView.OnScrollListener onScrollListener) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mOnScrollListener = onScrollListener;
} else {
mListView.setOnScrollListener(onScrollListener);
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (mOnScrollListener != null) {
mOnScrollListener.onScrollStateChanged(view, scrollState);
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (mOnScrollListener != null) {
mOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
View v = mListView.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();
int height = (v == null) ? 0 : v.getHeight();
if (firstVisibleItem == mLastFirstVisibleItem) {
translateBy(top - mLastTop);
} else {
if (firstVisibleItem > mLastFirstVisibleItem) {
translateBy(-mLastHeight - mLastTop + top);
} else {
translateBy(height - mLastTop + top);
}
}
mLastFirstVisibleItem = firstVisibleItem;
mLastTop = top;
mLastHeight = height;
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private void translateBy(int offsetY) {
int newTranslation = (int) mTargetView.getTranslationY() + offsetY;
if (newTranslation < -mTargetView.getHeight()) {
mTargetView.setTranslationY(-mTargetView.getHeight());
} else if (newTranslation > 0) {
mTargetView.setTranslationY(0);
} else {
mTargetView.setTranslationY(newTranslation);
}
}
}
QuickReturn.apply(mListView, mTargetView).withOnScrollListener(this);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment