LinearLayoutManager.findLastCompletelyVisibleItemPosition()在滚动时跳过项目

时间:2018-06-14 05:12:55

标签: android android-recyclerview linearlayoutmanager

我有一个带有LinearLayout管理器的RecyclerView,我需要在他的onScrolled方法中与RecyclerView的最后一项进行交互。

我正在使用这样的代码:

lm = new LinearLayoutManager(getActivity());
...
// rv initializing
...
rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            Log.d("Last item", ""+lm.findLastCompletelyVisibleItemPosition());
        }
    });

当我突然滚动列表时,我在Logcat中有这样的输出:

D/Last item: 11
D/Last item: 11
D/Last item: 13
D/Last item: 15
D/Last item: 19
D/Last item: 21
D/Last item: 23
D/Last item: 24
D/Last item: 26
D/Last item: 28
D/Last item: 30
D/Last item: 32
D/Last item: 33
D/Last item: 35

正如您所看到的,布局管理器跳过了一些元素。所以,我的问题是:如何避免这种情况并获得所有元素的位置?

1 个答案:

答案 0 :(得分:0)

我有一些问题,能够找到一种可能对您有所帮助的方法:我使用水平recyclerView和一个占用屏幕3/4的项目,我计算了项目宽度以获取当前项目位置,像这样:

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
       super.onScrolled(recyclerView, dx, dy);
       int horizontalScrollRange = recyclerView.computeHorizontalScrollRange();
       int scrollOffset = recyclerView.computeHorizontalScrollOffset();
       int currentItem = 0;
       float itemWidth = horizontalScrollRange * 1.0f / deviceGoodsItems.size();
       itemWidth = (itemWidth == 0) ? 1.0f : itemWidth;
       if (scrollOffset != 0) {
              currentItem = Math.round(scrollOffset / itemWidth);
       }
       currentItem = (currentItem < 0) ? 0 : currentItem;
       currentItem = (currentItem >= deviceGoodsItems.size()) ? deviceGoodsItems.size() - 1 : currentItem;

       }
});