在recyclerview中找到第一个完全可见的元素

时间:2016-10-22 07:48:44

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

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

  1. AppBarLayout
  2. CollapsingToolbarLayout
  3. AppBarLayoutToolbar
  4. CollapsingToolbarLayout
  5. RecyclerView
  6. 所有这些观点都在CoordinatorLayout之内。现在我需要找出RecyclerView中第一个完全可见的项目。通常我使用以下逻辑来获取它 -

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

    但是,即使第0个位置不完全可见,我也会得到很多1。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我自己找到了。当我使用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。

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

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