3

I want to make some hidden filters options above recyclerview (for example like in old versions of spotify):

enter image description here

How to do that? I use AppBar above my recycler.

Mateusz Kaflowski
  • 2,221
  • 1
  • 29
  • 35

4 Answers4

3

You can do it as mentioned in answer above (with changing visibility of searching view so when it is visibility is View.GONE the recycleView will move up, using ContraintLayout). Or to add aditional ViewHolder to yours adapter (like TopSearchViewHolder which contains yours searching view). Like this (in getItemViewType you would decide when to display particular viewType) :

      override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val orderViewHolder = OrderViewHolder.create(parent).apply {
            listener = this@OrdersAdapter.listener
        }
        return when (viewType) {
            R.layout.list_item1 -> orderViewHolder
            R.layout.list_item2 -> NetworkStateViewHolder.create(parent, retryCallback)
            else -> throw IllegalAccessException("Unknown view type $viewType")
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when (getItemViewType(position)) {
            R.layout.list_item1 -> (holder as OrderViewHolder).bind(getItem(position))
            R.layout.list_item2 -> (holder as NetworkStateViewHolder).bind(getItem(position))
        }
    }
   override fun getItemViewType(position: Int): Int {
        return if (hasExtraRow() && position == itemCount - 1) {
            R.layout.list_item1
        } else {
            R.layout.list_item2
        }
    }
mr.kostua
  • 696
  • 6
  • 12
3

You can use this code to do what you want

        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                    @Override
                    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                        super.onScrollStateChanged(recyclerView, newState);

                    }

                    @Override
                    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                        super.onScrolled(recyclerView, dx, dy);
                        if (dy > 0) {
                         //You should HIDE filter view here
                        } else if (dy < 0) {
                            System.out.println("Scrolled Upwards");
                            if (mLayoutManager.findFirstCompletelyVisibleItemPosition() == 0) {
                                //this is the top of the RecyclerView
                               System.out.println("==================================== >>>> Detect top of the item List");
                             //You should visible filter view here
                            } else {
                              //You should HIDE filter view here
                             }
                        } else {
                            System.out.println("No Vertical Scrolled");
                            //You should HIDE filter view here
                        }
                    }
                });
Dulanga
  • 921
  • 11
  • 23
2

Use the RecyclerView scroll listener as I mentioned in the comment like this

private static int firstVisibleInListview;

firstVisibleInListview = yourLayoutManager.findFirstVisibleItemPosition();

@Override
 public void onScrollStateChanged(RecyclerView recyclerView,int newState){
    super.onScrollStateChanged(recyclerView,newState);

    }

 @Override
  public void onScrolled(RecyclerView recyclerView,int dx,int dy){
    super.onScrolled(recyclerView,dx,dy);

    int currentFirstVisible = 
                yourLayoutManager.findFirstVisibleItemPosition(); 



    if(currentFirstVisible > firstVisibleInListview){
                image.setVisibility(View.VISIBLE);

            }else{      
    filterView.setVisibvility(View.GONE);
        }
       }
      }
    });

XML for RecyclerView layout

<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/White"
android:orientation="vertical"
android:layout_gravity="center"
xmlns:android="http://schemas.android.com/apk/res/android">

//use FilterView here
//hide this view initially.
   <Filter-view
    android:visibility="gone"
    android:id="@+id/filterView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/moviesRecyclerView"
    android:layout_marginBottom="?attr/actionBarSize"/>

<TextView
    android:visibility="gone"
    android:layout_marginTop="@dimen/dimen_200dp"
    android:id="@+id/noMoviesMessage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center"
    android:padding="@dimen/dimen_10dp"
    android:fontFamily="@font/noirden_bold"
    android:textColor="@color/Black"
    android:textSize="@dimen/text_18sp"
    android:text="@string/the_are_no_movies_showing_right_now_please_check_later"/>

</LinearLayout>

let me know after you try this

Brahma Datta
  • 1,102
  • 1
  • 12
  • 20
0

My solution for now:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
        int dy = 0;
        Handler handler = new Handler();

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, final int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            final boolean isOnTop = layoutManager.findFirstCompletelyVisibleItemPosition() == 0;
            if (isOnTop && newState == 1)
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (dy <= 0) {
                            KLog.d("show filter");
                        }
                    }
                }, 20);
            else if (newState == 1 && dy > 0)
                KLog.e("gone filter");

        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            this.dy = dy;
        }
    });

Not super elegant and still need to find a way to animate hidden view.

Mateusz Kaflowski
  • 2,221
  • 1
  • 29
  • 35