Скрытый вид выше RecyclerView - PullRequest
2 голосов
/ 21 мая 2019

Я хочу сделать несколько опций скрытых фильтров над утилитацией просмотра (например, как в старых версиях spotify):

enter image description here

Как это сделать? Я использую AppBar над моим утилизатором.

Ответы [ 5 ]

2 голосов
/ 21 мая 2019

Вы можете сделать это, как упомянуто в ответе выше (с изменением видимости поискового представления, поэтому, когда это видимость - 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
        }
    }
1 голос
/ 21 мая 2019

Используйте слушатель прокрутки 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);
        }
       }
      }
    });

XML для макета RecyclerView

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

дайте мне знать, после того, как попробуете

1 голос
/ 21 мая 2019

Вы можете использовать этот код, чтобы делать то, что вы хотите

        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
                        }
                    }
                });
0 голосов
/ 21 мая 2019

Мое решение на данный момент:

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

Не супер элегантный и все же нужно найти способ оживить скрытый вид.

0 голосов
/ 21 мая 2019

Для этого вы можете использовать относительную разметку и добавить линейную разметку, которая содержит там панель поиска, поэтому, когда вы устанавливаете видимость, переходящую в строку поиска, линейная разметка все еще там, которая будет содержать разметку, как это было раньше.

...