【问题标题】:Find first completely visible element in recyclerview在 recyclerview 中找到第一个完全可见的元素
【发布时间】:2017-03-04 12:47:44
【问题描述】:

我有一个具有视差效果的布局。所以这是其中的元素-

  1. AppBarLayout
  2. CollapsingToolbarLayoutAppBarLayout
  3. ToolbarCollapsingToolbarLayout
  4. RecyclerView

所有这些视图都在CoordinatorLayout 内。现在我需要找出RecyclerView 的第一个完全可见的项目是什么。通常我使用以下逻辑来获取它-

int firstVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition();

但是,当第 0 个位置不完全可见时,我得到很多 1。

【问题讨论】:

    标签: android android-recyclerview material-design android-collapsingtoolbarlayout android-appbarlayout


    【解决方案1】:

    getChildAt 从第一个可见位置开始,而不是在适配器的位置。

    这是生成的代码。

    int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
    View v = layoutManager.getChildAt(0);
    if (firstVisiblePosition > 0 && v != null) {
        int offsetTop = v.getTop();
        chatAdapter.notifyDataSetChanged();
    
        if (firstVisiblePosition - 1 >= 0 && chatAdapter.getItemCount() > 0) {
             layoutManager.scrollToPositionWithOffset(firstVisiblePosition - 1, offsetTop);
        }
    }
    

    【讨论】:

    • 没有。我在其他地方看到过这个解决方案。它对我不起作用。我需要做的是,我在底部有一个粘性视图,一旦从RecyclerView 完全可见相同的视图并且我没有正确获得滚动更新,就应该将其设为View.GONE
    【解决方案2】:

    我自己找到的。当我使用AppBarLayout 时,我需要检查在特定滚动时屏幕上是否有特定视图可用。

    我做的是:

    @Override
        public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
    
            View v = recyclerView.getLayoutManager().getChildAt(1);
            int offset = 0;
            if (v != null) {
                offset = v.getTop();
            }
    
            if ((verticalOffset * -1) >= offset) {
                layoutBuy.setVisibility(View.GONE);
            } else {
                layoutBuy.setVisibility(View.VISIBLE);
            }
        }
    

    我使用 recyclerView.getLayoutManager().getChildAt(1); 是因为我想使用 1 的特定位置。

    因为,垂直偏移在滚动时变为负值,我将它乘以 -1。然后检查我正在寻找的视图的偏移量和顶部是否相同。

    因此在屏幕上使用parallax效果同时需要检查RecyclerView中可见哪个视图,需要上述逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-30
      相关资源
      最近更新 更多