私は現在、RomanNurikのスティッキースクロールビューテクニックと同様の機能を備えたフラグメントに取り組んでいます。
http://code.google.com/p/romannurik-code/source/browse/misc/scrolltricks
ただし、ListViewで使用して、画面の上部と下部の両方に貼り付けたいと思います。画面の上部と下部にある2つの非表示のビューを使用し、次を使用して正しいアイテムが上部または下部に到達したときにリストでそれらを再表示することで、ある程度成功しました。
//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)がフラグメントの開始時に画面に表示される最初のアイテムの1つである場合、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に設定されています。このビューが画面から1回スクロールするまで、getTop()とgetY()に対して常に0を返す理由を誰かが理解できますか?その後、すべてが順調です。
何かアドバイス?
ありがとう、ジョシュ