【问题标题】:Check if child view of RecyclerView item is visible on screen检查 RecyclerView 项目的子视图是否在屏幕上可见
【发布时间】:2020-11-17 04:49:39
【问题描述】:

我有一个场景,我需要知道 RecyclerView 项目的子视图是否在屏幕上可见。

在这种情况下,每个 RecyclerView 项目都有一个TextView,我需要知道该 TextView 是否在屏幕上完全可见。我已经弄清楚了这部分,但现在我的问题是:

如何从我的片段调用适配器,让它知道视图在屏幕上可见?为此我应该遵循什么最佳做法?

这是我获取可见子视图的片段类方法:

    private void getFirstVisibleChildView() {
        int findFirstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
        int findLastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();

        int [] positions = { findFirstVisibleItemPosition, findLastVisibleItemPosition };

        PostAdapter.PostViewHolder viewHolder;

        Rect scrollBounds = new Rect();
        recyclerView.getDrawingRect(scrollBounds);

        int[] location = new int[2];
        for (int position : positions) {
            RecyclerView.ViewHolder item = recyclerView.findViewHolderForAdapterPosition(position);

            if (item instanceof PostAdapter.PostViewHolder) {
                viewHolder = (PostAdapter.PostViewHolder) item;

                viewHolder.getChildView().getLocationInWindow(location);

                if (location[1] < 0 || location[1] > scrollBounds.bottom) {
                    // Not visible
                } else {
                    // Visible
                    // How to call the RecyclerView adapter here and be able to manipulate it?
                    // Custom listener, direct call to ViewHolder, or some other method?
                }
            }
        }
    }

谢谢!

【问题讨论】:

  • 如果它是可见的,你想做什么?

标签: android android-recyclerview


【解决方案1】:

您可以在 RecyclerView 上设置addOnScrollListener,以便在滚动时检查您的特定视图是否完全显示

并且通常在您的适配器中创建一个自定义方法,当满足上述条件时,您希望在此侦听器中调用该方法。

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        if (mRecyclerViewTafsir.getLayoutManager() == null) return;

        // Here you can check if the particular textView is fully 
        // appeared on the screen >> You already did this part
        
        mAdapter.callBack(); // call a method in the adapter when the condition is met
    }
});

【讨论】:

  • 嗯,这会调用适配器,但不会调用适配器中的特定项目。那该怎么做呢?
  • @user4165123 我认为您需要在滚动recyclerView 时调用getFirstVisibleChildView(),并检查您是否属于此方法内的else 分支.. getFirstVisibleChildView() 应该注意不是第一个可见的项目吗?
猜你喜欢
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2011-07-18
相关资源
最近更新 更多