Android在RecyclerView中获得可见子对象的计数

Android在RecyclerView中获得可见子对象的计数,android,android-recyclerview,Android,Android Recyclerview,我试图知道用户在recyclerview中可以看到多少项,在某些设备中,此计数不同,我无法使用以下代码计算: private int countVisibleRow() { if (messagesView.getLayoutManager() != null) { LinearLayoutManager layoutManager = (LinearLayoutManager) messagesView.getLayoutManager(); int

我试图知道用户在recyclerview中可以看到多少项,在某些设备中,此计数不同,我无法使用以下代码计算:

private int countVisibleRow() {
    if (messagesView.getLayoutManager() != null) {
       LinearLayoutManager layoutManager = (LinearLayoutManager) messagesView.getLayoutManager();
       int                 first         = layoutManager.findFirstVisibleItemPosition();
       int                 last          = layoutManager.findLastVisibleItemPosition();
       return last - first;
    } else {
       return 0;
    }
}

无论何时滚动recylerView,都将代码放入onScroll listner方法中此方法将被激发(将此代码放入构造函数中的适配器类中)


无论何时滚动recylerView,都将代码放入onScroll listner方法中此方法将被激发(将此代码放入构造函数中的适配器类中)

尝试以下方法:

public class LinearLayoutManagerWithSmoothScroller extends LinearLayoutManager {

    public LinearLayoutManagerWithSmoothScroller(Context context) {
        super(context, HORIZONTAL, false);
    }

    @Override
    public int findFirstVisibleItemPosition() {
        return super.findFirstVisibleItemPosition();
    }

    @Override
    public int findLastVisibleItemPosition() {
        return super.findLastVisibleItemPosition();
    }

    public LinearLayoutManagerWithSmoothScroller(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
                                       int position) {
        RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext());
        smoothScroller.setTargetPosition(position);
        startSmoothScroll(smoothScroller);
    }

    private class TopSnappedSmoothScroller extends LinearSmoothScroller {
        public TopSnappedSmoothScroller(Context context) {
            super(context);

        }

        @Override
        public PointF computeScrollVectorForPosition(int targetPosition) {
            return LinearLayoutManagerWithSmoothScroller.this
                    .computeScrollVectorForPosition(targetPosition);
        }

        @Override
        protected int getVerticalSnapPreference() {
            return SNAP_TO_START;
        }
    }
}
   layoutmanager = new LinearLayoutManagerWithSmoothScroller(QuestionsActivity.this);
  paginationRV.setLayoutManager(layoutmanager);
使用方法如下:

public class LinearLayoutManagerWithSmoothScroller extends LinearLayoutManager {

    public LinearLayoutManagerWithSmoothScroller(Context context) {
        super(context, HORIZONTAL, false);
    }

    @Override
    public int findFirstVisibleItemPosition() {
        return super.findFirstVisibleItemPosition();
    }

    @Override
    public int findLastVisibleItemPosition() {
        return super.findLastVisibleItemPosition();
    }

    public LinearLayoutManagerWithSmoothScroller(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
                                       int position) {
        RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext());
        smoothScroller.setTargetPosition(position);
        startSmoothScroll(smoothScroller);
    }

    private class TopSnappedSmoothScroller extends LinearSmoothScroller {
        public TopSnappedSmoothScroller(Context context) {
            super(context);

        }

        @Override
        public PointF computeScrollVectorForPosition(int targetPosition) {
            return LinearLayoutManagerWithSmoothScroller.this
                    .computeScrollVectorForPosition(targetPosition);
        }

        @Override
        protected int getVerticalSnapPreference() {
            return SNAP_TO_START;
        }
    }
}
   layoutmanager = new LinearLayoutManagerWithSmoothScroller(QuestionsActivity.this);
  paginationRV.setLayoutManager(layoutmanager);
尝试以下方法:

public class LinearLayoutManagerWithSmoothScroller extends LinearLayoutManager {

    public LinearLayoutManagerWithSmoothScroller(Context context) {
        super(context, HORIZONTAL, false);
    }

    @Override
    public int findFirstVisibleItemPosition() {
        return super.findFirstVisibleItemPosition();
    }

    @Override
    public int findLastVisibleItemPosition() {
        return super.findLastVisibleItemPosition();
    }

    public LinearLayoutManagerWithSmoothScroller(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
                                       int position) {
        RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext());
        smoothScroller.setTargetPosition(position);
        startSmoothScroll(smoothScroller);
    }

    private class TopSnappedSmoothScroller extends LinearSmoothScroller {
        public TopSnappedSmoothScroller(Context context) {
            super(context);

        }

        @Override
        public PointF computeScrollVectorForPosition(int targetPosition) {
            return LinearLayoutManagerWithSmoothScroller.this
                    .computeScrollVectorForPosition(targetPosition);
        }

        @Override
        protected int getVerticalSnapPreference() {
            return SNAP_TO_START;
        }
    }
}
   layoutmanager = new LinearLayoutManagerWithSmoothScroller(QuestionsActivity.this);
  paginationRV.setLayoutManager(layoutmanager);
使用方法如下:

public class LinearLayoutManagerWithSmoothScroller extends LinearLayoutManager {

    public LinearLayoutManagerWithSmoothScroller(Context context) {
        super(context, HORIZONTAL, false);
    }

    @Override
    public int findFirstVisibleItemPosition() {
        return super.findFirstVisibleItemPosition();
    }

    @Override
    public int findLastVisibleItemPosition() {
        return super.findLastVisibleItemPosition();
    }

    public LinearLayoutManagerWithSmoothScroller(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state,
                                       int position) {
        RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext());
        smoothScroller.setTargetPosition(position);
        startSmoothScroll(smoothScroller);
    }

    private class TopSnappedSmoothScroller extends LinearSmoothScroller {
        public TopSnappedSmoothScroller(Context context) {
            super(context);

        }

        @Override
        public PointF computeScrollVectorForPosition(int targetPosition) {
            return LinearLayoutManagerWithSmoothScroller.this
                    .computeScrollVectorForPosition(targetPosition);
        }

        @Override
        protected int getVerticalSnapPreference() {
            return SNAP_TO_START;
        }
    }
}
   layoutmanager = new LinearLayoutManagerWithSmoothScroller(QuestionsActivity.this);
  paginationRV.setLayoutManager(layoutmanager);


结果是什么?recyclerview的整个概念是,你不必担心有多少是可见的。LayoutManager为每个设备相应地处理它,还可以缓存更多的行。你为什么需要可见的计数?@OrkunKoçyiğit我明白了zero@Mahdi.Pishguy试试我的解决方案结果如何?recyclerview的整个概念是,你不必担心有多少是可见的。LayoutManager为每个设备相应地处理它,还可以缓存更多的行。你为什么需要可见的计数?@OrkunKoçyiğit我明白了zero@Mahdi.Pishguy请尝试我的解决方案,以便在项目对用户可见时如何获取项目的计数?使用与获取layoutmanger.findLastVisibleItemPosition()相同的方法但请确保layoutmanager是LinearLayoutManager的实例,带有SmoothScroller类默认情况下,我在recyclerView上有两个可见项,但我得到
-1
always@Mahdi.Pishguy你在LayoutManager.findLastVisibleItemPosition()中得到了什么那个么,当项目对用户可见时,如何获取项目的数量呢?使用与获取layoutmanger.findLastVisibleItemPosition()相同的方法但请确保layoutmanager是LinearLayoutManager的实例,带有SmoothScroller类默认情况下,我在recyclerView上有两个可见项,但我得到
-1
always@Mahdi.Pishguylayoutmanger.findLastVisibleItemPosition()@shahis17june不滚动项目怎么样?@shahis17june不滚动项目怎么样?