- 
                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:fastScrollerHandleAlwaysVisible="false"
    app:fastScrollerIgnoreTouchesOutsideHandle="false"
    tools:visibility="visible"/>You can override default scrollbar and handle colors in yours values/colors.xml:
<!-- Override fastScroller bar color and handle idle color -->
<!-- Tip: you can use transparency -->
<color name="fast_scroller_bar">#bccc</color>
<color name="fast_scroller_handle_idle">#caaa</color>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.setHandleAlwaysVisible(false);        //false 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 {
        // Get and show the first character
        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 also 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
 @+idto the views of the base layout. For instance, to customize the shape of the bubble text, just overridedrawable/fast_scroller_bubble.xml.- The activation color is assigned at runtime when initialized, usually is the accent color.
 - Interface
 FastScroller.AdapterInterfaceand ClassFastScroller.Delegateallow to use FastScroller with any Adapter library, not only FlexibleAdapter.
In your code, pass the new views to the FastScroller before assigning it to the Adapter:
fastScroller.setViewsToUse(
                R.layout.library_fast_scroller_layout,
                R.id.fast_scroller_bubble,
                R.id.fast_scroller_handle);
mAdapter.setFastScroller(fastScroller);/**
 * 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!