2

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

在此处输入图像描述

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

4

4 回答 4

2

您可以按照上面答案中的说明进行操作(通过更改搜索视图的可见性,因此当可见性为 View.GONE 时,recycleView 将使用 ContraintLayout 向上移动)。或者将额外的 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
        }
    }
于 2019-05-21T11:25:03.830 回答
1

您可以使用此代码做您想做的事

        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
                        }
                    }
                });
于 2019-05-21T11:26:32.703 回答
1

使用我在这样的评论中提到的 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>

试试这个后告诉我

于 2019-05-21T11:41:10.563 回答
0

我现在的解决方案:

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

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

于 2019-05-21T12:47:21.340 回答