代码之家  ›  专栏  ›  技术社区  ›  Mateusz Kaflowski

RecyclerView上方的隐藏视图

  •  1
  • Mateusz Kaflowski  · 技术社区  · 5 年前

    我想在recyclerview上面创建一些隐藏过滤器选项(例如在旧版本的spotify中):

    enter image description here

    怎么做?我在回收站上面用AppBar。

    1 回复  |  直到 5 年前
        1
  •  2
  •   mr.kostua    5 年前

    您可以按照上面的回答进行操作(通过更改搜索视图的可见性,以便在可见性为视图时,recycleView将使用contrintlayout向上移动)。或者在适配器中添加其他的ViewHolder(比如包含搜索视图的TopSearchViewHolder)。 像这样(在getItemViewType中,您将决定何时显示特定的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
            }
        }
    
        2
  •  1
  •   Dulanga    5 年前

    你可以用这段代码做你想做的事

            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
                            }
                        }
                    });
    
        3
  •  1
  •   Brahma Datta    5 年前

    像我在评论中提到的那样使用RecyclerView滚动监听器

    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);
            }
           }
          }
        });
    

    用于RecyclerView布局的XML

    <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>
    

    你试过之后告诉我

        4
  •  0
  •   Mateusz Kaflowski    5 年前

    我现在的解决方案是:

    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;
            }
        });
    

    不是超级优雅,仍然需要找到一种方法来动画隐藏视图。