1

私は現在、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を返す理由を誰かが理解できますか?その後、すべてが順調です。

何かアドバイス?

ありがとう、ジョシュ

4

2 に答える 2

3

わかりました、これを見逃したのはばかげていますが、ここにあります:

レイアウトのxmlで、ListViewをfill_parentではなくwrap_contentとして設定しました。フラグメントコーディングを見るのに非常に多くの時間を費やしたので、レイアウトをチェックすることを考えたことはありませんでした。

フラビオのおかげで、彼の答えはうまくいくはずですが、結局は不要でした。

于 2012-11-15T11:03:09.067 に答える
1

次のレイアウトパスのためにgetTop()の呼び出しをスケジュールします。この時点で、ビューは測定されています。これを試してみてください:

final Handler h = new Handler();
list.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        h.post(new Runnable() {
            public void run() {
                onScrollChanged();
                scrollListen = true;
            }
        });    
    }
});
于 2012-11-13T03:40:06.230 に答える