-
Notifications
You must be signed in to change notification settings - Fork 554
5.x | FastScroller
FastScroller needs an XML layout and Java initialization. The layout has to be placed at the end of the view hierarchy after everything else has been declared:
...
<android.support.v7.widget.RecyclerView
.../>
...
<!-- FastScroller Layout must be at the end of ViewHierarchy
in order to be displayed at the top of every views -->
<include layout="@layout/fast_scroller"/>
</FrameLayout>
Here is the layout/fast_scroller.xml
<eu.davidea.fastscroller.FastScroller
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/fast_scroller"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_alignTop="@+id/swipeRefreshLayout"
android:layout_alignBottom="@+id/swipeRefreshLayout"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
app:fastScrollerAutoHideEnabled="true"
app:fastScrollerAutoHideDelayInMillis="1000"
app:fastScrollerBubblePosition="adjacent"
app:fastScrollerBubbleEnabled="true"
app:fastScrollerIgnoreTouchesOutsideHandle="false"
tools:visibility="visible"/>
In the creation of the Activity/Fragment call setFastScroller()
after the Adapter has been attached to the RV:
// First, assign the Adapter to the RV
mRecyclerView.setAdapter(mAdapter);
// Then, add FastScroller to the RecyclerView
FastScroller fastScroller = getView().findViewById(R.id.fast_scroller);
fastScroller.setAutoHideEnabled(true); //true is the default value
fastScroller.setAutoHideDelayInMillis(1000L); //1000ms is the default value
fastScroller.setIgnoreTouchesOutsideHandle(false); //false is the default value
// 0 pixel is the default value. When > 0 it mimics the fling gesture
fastScroller.setMinimumScrollThreshold(70);
// OnScrollStateChangeListener remains optional
fastScroller.addOnScrollStateChangeListener((MainActivity) getActivity());
fastScroller.removeOnScrollStateChangeListener((MainActivity) getActivity())
// The color (accentColor) is automatically fetched by the FastScroller constructor,
// but you can change it at runtime:
fastScroller.setBubbleAndHandleColor(Color.RED)
// Finally, assign the Fastscroller to the Adapter
mAdapter.setFastScroller(fastScroller);
A useful callback is triggered when the handle is dragged, the method onFastScrollerStateChange()
is invoked.
From the Activity, implement the callback method:
@Override
public void onFastScrollerStateChange(boolean scrolling) {
// Example
if (scrolling) hideFab();
else showFab();
}
The text is built from the Adapter callback. It has to be implemented/overridden from the inside of a CustomAdapter that extends FlexibleAdapter:
@Override
public String onCreateBubbleText(int position) {
if (position < getScrollableHeaders().size()) {
return "Top";
} else if (position >= getItemCount() - getScrollableFooters().size()){
return "Bottom";
} else {
IFlexible iFlexible = getItem(position);
return iFlexible.toString().substring(0,1).toUpperCase();
}
}
!
The following 3 Adapter methods give some control on the FastScroller
instance:
/**
* Changes the visibility of the View
*/
public void toggleFastScroller();
/**
* Returns true, if FastScroller is configured and shown, false otherwise
*/
public boolean isFastScrollerEnabled();
/**
* Returns the FastScroller instance for more control on the settings.
*/
public FastScroller getFastScroller();
But you can also control it directly:
fastScroller.setEnabled(true/false);
fastScroller.hideScrollbar();
fastScroller.showScrollbar();
fastScroller.toggleFastScroller();
fastScroller.isHidden();
fastScroller.isAutoHideEnabled();
FastScroller is composed by:
- drawable/fast_scroller_bubble.xml
- drawable/fast_scroller_handle.xml
- layout/library_fast_scroller_layout.xml
ℹ️ Tips:
- The Resources can be overridden by assigning the same
@+id
to the views of the base layout.- The activation color is assigned at runtime when initialized, usually is the accent color.
/**
* Sample class that extends the FastScroller
*/
public class ModifiedFastScroller extends FastScroller {
public ModifiedFastScroller(Context context) {
super(context);
}
public ModifiedFastScroller(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ModifiedFastScroller(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void updateBubbleText(int position) {
super.updateBubbleText(position);
// You can set a default way to update the text in the bubble.
String bubbleTextString = bubbleTextCreator.onCreateBubbleText(position);
if (TextUtils.isEmpty(bubbleTextString)) {
bubble.setVisibility(View.VISIBLE);
bubble.setText("...");
bubble.setTextSize(TypedValue.COMPLEX_UNIT_PT, 32);
}
}
@Override
protected void setBubbleAndHandlePosition(float y) {
// You can modify the computed y-position of the bubble and the handle in this method.
// For this example, I allowed the bubble to be at the bottom-most part of the screen.
super.setBubbleAndHandlePosition(y);
if (bubble != null && bubblePosition == FastScrollerBubblePosition.ADJACENT) {
bubble.setY(getValueInRange(0, height - handle.getHeight(), (int) (y - bubble.getHeight())));
}
}
}
- Update Data Set
- Selection modes
- Headers and Sections
- Scrollable Headers and Footers
- Expandable items
- Drag&Drop and Swipe
- EndlessScroll / On Load More
- Search Filter
- FastScroller
- Adapter Animations
- Third party Layout Managers
- Payload
- Smooth Layout Managers
- Flexible Item Decoration
- Utils
- ActionModeHelper
- AnimatorHelper
- EmptyViewHelper
- UndoHelper
* = Under revision!