【问题标题】:How to check if first item of RecyclerView is visible on the screen如何检查 RecyclerView 的第一项是否在屏幕上可见
【发布时间】:2018-06-22 08:08:08
【问题描述】:

是否可以检查RecyclerView的第一项或第二项是否在用户的屏幕上可见?

例如当用户向下滚动时:

  if (first item not visible to user)  { 
      // do something
  }
  else if ( first item is visible){
      // do something
  }

我目前所做的是向我的回收器添加一个侦听器,以便当用户向下滚动时,它会执行某些操作并向上滚动。

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        if (dy > 0) {
            mAccountLayout.setVisibility(View.GONE);
            mDateLayout.setVisibility(View.GONE);
            Log.d("SCROLLINGDOWN","SCROLL");
        } else {
            mAccountLayout.setVisibility(View.VISIBLE);
            mDateLayout.setVisibility(View.VISIBLE);
            Log.d("SCROLLINGUP","SCROLL");
        }
    }
});

但我需要检查第一项是否可见。

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    您可以在RecyclerView.LayoutManager 中找到一些辅助方法,例如,如果您使用LinearLayoutManager,请检查这些方法:

    int findFirstCompletelyVisibleItemPosition() // Returns the adapter position of the first fully visible view.
    int findFirstVisibleItemPosition() // Returns the adapter position of the first visible view.
    int findLastCompletelyVisibleItemPosition() // Returns the adapter position of the last fully visible view.
    int findLastVisibleItemPosition() // Returns the adapter position of the last visible view.
    

    查看完整文档here

    在您的代码中:

    recyclerView.setAdapter(adapter);
    final LinearLayoutManager layoutManager = new LinearLayoutManager(context);
    recyclerView.setLayoutManager(layoutManager);
    
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            if (layoutManager.findFirstVisibleItemPosition() > 0) {
                mAccountLayout.setVisibility(View.GONE);
                mDateLayout.setVisibility(View.GONE);
                Log.d("SCROLLINGDOWN","SCROLL");
            } else {
                mAccountLayout.setVisibility(View.VISIBLE);
                mDateLayout.setVisibility(View.VISIBLE);
                Log.d("SCROLLINGUP","SCROLL");
            }
        }
    });
    

    【讨论】:

    • 对不起,我不明白 :(
    【解决方案2】:
    int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
    if (firstVisiblePosition  == 0) { do your thing )
    

    【讨论】:

    • 我应该把它放在我的滚动监听器中吗?
    • 检查最适合您的活动。只是一个提示,不要在监听器中放置太多的 if 语句或操作,因为当用户滚动时会多次触发该事件。
    • recyclerview.findFirstVisibleItemPosition() 不工作,我很抱歉。怎么办。
    • 我知道你应该怎么做,再次阅读我的回复。你应该使用你的布局管理器。
    • 我目前有 RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(mContext)。我不能使用 findFirstVisibleItemPosition
    【解决方案3】:
       declare globally LinearLayoutManager layoutManager;
    
    and in oncreate use
    
         layoutManager = new LinearLayoutManager(this);
    
    use this layoutmanager in recyclerview
       recyclerview.setLayoutManager(layoutManager);
    
            recyclerview.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
    
                    //Tocheck if  recycler is on top
                    if (layoutManager.findFirstCompletelyVisibleItemPosition() == 0) {
    //Its at top ..
                        //ie first item is visible
                    } else {
                 //not visible`enter code here`
                    }
                }
            });
    

    【讨论】:

      【解决方案4】:

      试试这个东西..

          private LinearLayoutManager linearLayoutManager;// this two line define as global level.
      protected int pastVisibleItems, visibleItemCount, totalItemCount;
      protected void addScrollListener() {
          rvData.addOnScrollListener(new RecyclerView.OnScrollListener() {
              @Override
              public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                  if (dy > 0) //check for scroll down
                  {
                      visibleItemCount = linearLayoutManager.getChildCount();
                      totalItemCount = linearLayoutManager.getItemCount();
                      pastVisibleItems = linearLayoutManager.findFirstVisibleItemPosition();
      
                      if (!isPullingMoreResults) {
                          if ((visibleItemCount + pastVisibleItems) >= totalItemCount) {
                              if (mHasMoreResultsToPull && !isPullingMoreResults) {
                                  isPullingMoreResults = true;
                                  pageNumber++;
                                  getMessage();
                              }
                          }
                      }
                  }
              }
          });
      }
      

      【讨论】:

      • 我不明白,对不起:(
      • 我应该把消失和可见的代码部分放在哪里?我在代码中说没有消失并且代码的可见部分。
      • 如果 (n) 项可见。它应该可见,否则消失。
      【解决方案5】:

      当用户滚动慢或快时避免滞后并修复错误

         viewBinding.recycler.addOnScrollListener(object : RecyclerView.OnScrollListener() {
                      override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                
          
                          if (recyclerView.scrollState == RecyclerView.SCROLL_STATE_SETTLING) {
                              if (dy > 0) {
                               //scrolled to Bottom of List
      
                                  viewBinding.searchLayout.visibility = View.GONE
          
                              }
                              //if user scroll fast this if handle it
                              if (dy <= 0) {
                              //scrolled to Top of List
      
                                  if (!viewBinding.recycler.canScrollVertically(-1)) {
                                    //recycler view is in firstPosition
                                      viewBinding.searchLayout.visibility = View.VISIBLE
                                  }
                              }
                          } else if (dy <= 0) { //if user scroll slow this if handle it
                           //scrolled to Top of List
      
                                
                              if (!viewBinding.recycler.canScrollVertically(-1)) {
                                    //recycler view is in firstPosition
                                  viewBinding.searchLayout.visibility = View.VISIBLE
                              }
                          }
                      }
                  })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-30
        • 1970-01-01
        • 1970-01-01
        • 2015-03-29
        • 1970-01-01
        • 2016-04-18
        • 2014-12-15
        • 2011-07-18
        相关资源
        最近更新 更多