我目前正在研究一个功能类似于 Roman Nurik 的粘性滚动视图技术的片段:
http://code.google.com/p/romannurik-code/source/browse/misc/scrolltricks
但是,我想将它与 ListView 一起使用,并让它同时贴在屏幕的顶部和底部。通过在屏幕顶部和底部使用两个隐藏视图,并在正确的项目到达顶部或底部时使用以下命令取消隐藏它们,我已经取得了一定的成功:
//Similar to Roman's Stick ScrollView
@Override
public void onScrollChanged() {
if(scrollListen){
if(mMovingClock != null && mMovingClock.getTop() <= list.getTop()){
//Log.i("DraftSync", "View at " + String.valueOf(mMovingClock.getTop()));
clockTop.setVisibility(View.VISIBLE);
}else {
clockTop.setVisibility(View.INVISIBLE);
}
if(mMovingClock != null && mMovingClock.getBottom() >= list.getBottom()){
clockBottom.setVisibility(View.VISIBLE);
}else {
clockBottom.setVisibility(View.INVISIBLE);
}
}
}
我遇到的问题是,如果我的目标列表项 (mMovingClock) 是片段开始时屏幕上显示的初始项之一,则 list.GetTop() 方法返回零。我进行了广泛的搜索,并了解到这是因为它在将其呈现在屏幕上的位置之前对其进行了测量,但是我在我认为应该在的位置启用了 scrollListen:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_draft, container, false);
list = (ObservableListView)rootView.findViewById(R.id.draft_queue);
list.setCallbacks(this);
...
list.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
onScrollChanged();
scrollListen = true;
}
});
return rootView;
}
我想我正确地遵循了这个例子,但是在正确测量 mMovingClock 之前,scrollListen 被设置为 true。谁能弄清楚为什么这个视图总是为 getTop() 和 getY() 返回 0 直到它滚出屏幕一次?之后一切都很好。
有什么建议吗?
谢谢,乔什