我有一个带有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
正如您所看到的,布局管理器跳过了一些元素。所以,我的问题是:如何避免这种情况并获得所有元素的位置?
答案 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;
}
});