Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android sticky header RecyclerView/ Section Header RecyclerView

Hello All I have just created a demo to work with new android L widget RecyclerView.I have also implemented Pull-To-Refresh using SwipeRefreshLayout but problem for me now is how can I implement sticky header here,Because when i try to set

mRecyclerView.setOnScrollListener(new OnScrollListener() {

    @Override
    public void onScrolled(int arg0, int arg1) {

    }

    @Override
    public void onScrollStateChanged(int arg0) {
        // TODO Auto-generated method stub

    }
});

I get only these 2 methods so dont have any idea how can I handle this...

Please help..

like image 781
Pramod Avatar asked Jul 21 '14 06:07

Pramod


2 Answers

Since the previous answers don't provide a reliable solution, I propose my FlexibleAdapter library for RecyclerView, that is able to handle all following functionalities at once:

  • Sticky functionality for headers with Sections, works with all 3 LayoutManagers and with ViewPager too.
  • Selection Modes.
  • Multiple item types with auto-mapping.
  • Predefined ViewHolders.
  • Expandable items with Selection Coherence.
  • Draggable and Swipe-To-Dismiss.
  • Animated Async Filter with spannable text.
  • Scrolling Animations.
  • EndlessScroll with Adapter binding.
  • UndoHelper & ActionMode Helper.
  • FastScroller.
  • ...and more.

The idea behind is to avoid to create from scratch over again a custom Adapter for every project and to have more functionalities in one library, instead of relying on different libraries that support only 1 or 3 of them and that you cannot merge.

like image 169
Davideas Avatar answered Nov 02 '22 01:11

Davideas


public void onScrolled(int dx, int dy)

those are the two arguments that you're receiving onScrolled, that means, the number of pixels that the RecyclerView changed on the X and Y axis... so probably all you want to do is:

@Override
public void onScrolled(int dx, int dy) {
   if(dx < 0) // going up
      showSitckyHeader();
}

you can probably further improve this implementation by adding a minimum scroll amount. Something like:

int totalScrolled = 0;
@Override
public void onScrolled(int dx, int dy) {
   totalScrolled += dx;
   if(totalScrolled < MIN_SCROLL)
      showSitckyHeader();
   if(dx > 0)
      totalScrolled = 0;
}

@Override
public void onScrollStateChanged(int newState) {
   if(newState == SCROLL_STATE_IDLE || newState = SCROLL_STATE_SETTLING)
       totalScrolled = 0;
}

or even go further and implement speed, counting time, but those types of implementation are more tricky, and you have to test it yourself.

like image 41
Budius Avatar answered Nov 02 '22 03:11

Budius