我有一个包含ViewHolder项目列表的RecyclerView。当用户触摸某个项目时,其布局/视图会展开以显示更多详细信息。非常标准的东西,效果很好......除了在这种情况下:
如果用户滚动到列表中的最后一项,然后触摸它,该项目就会扩展到视野之外。换句话说,当项目展开时,它会扩展列表的底部,但列表不会自动滚动以将所有展开的项目保持在“在屏幕上”或“在视图中”在RecyclerView的范围内。
我已经尝试将RecyclerView.scrollToPosition()添加到列表中的最后一个位置,但列表不会移动。
用户可以手动滚动列表并将完整展开的项目置于视图中,但我希望它自动发生。
思想?
编辑:我不知道这是否影响了事情,但是列表已经手动滚动到列表的底部,所以看起来像programmaticaly滚动到相同位置是多余的。基本上我要做的是“刷新”列表中的滚动位置,以便将整个最终列表条目带入视图。
答案 0 :(得分:2)
我使用LinearLayoutManager滚动方法几乎。对我来说,解决方案是使用LinearLayoutManager.scrollToPositionWithOffset()
,同时提供扩展视图的额外大小作为偏移量。
int distanceInPixels;
View firstVisibleChild = recyclerView.getChildAt(0);
int itemHeight = firstVisibleChild.getHeight();
int currentPosition = recyclerView.getChildAdapterPosition(firstVisibleChild);
int p = Math.abs(position - currentPosition);
if (p > 5) distanceInPixels = (p - (p - 5)) * itemHeight;
else distanceInPixels = p * itemHeight;
layoutMgr.scrollToPositionWithOffset(position, distanceInPixels);
答案 1 :(得分:0)
尝试使用“max_size - 1”作为 import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class UserService {
// Observable user
user = new Subject<string>();
}
方法中的位置参数。在这里,max_size是列表中的项目数。