2012-11-12 91 views
1

我目前正在與功能類似於羅馬Nurik的粘性滾動型技術在這裏片段後屏幕上:安卓:獲取ListView項位置佈局

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。任何人都可以找出爲什麼這個視圖總是返回0爲getTop()和getY(),直到它滾動屏幕一次?之後,一切都很好。

有什麼建議嗎?

感謝, 喬希

回答

3

好吧,我覺得傻缺這一點,但在這裏它是:

的XML中我的佈局,我有我的ListView設置爲WRAP_CONTENT而不是FILL_PARENT。我花了很多時間看片段編碼,我從來沒有考慮檢查佈局。

感謝弗拉維奧,因爲看起來他的答案應該起作用,但最終是沒有必要的。

1

附表調用共達()未來佈局傳遞。在這個時候,你的觀點將被測量。嘗試了這一點:

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; 
      } 
     });  
    } 
}); 
+0

不幸的是,這種方法沒有奏效。電話似乎延遲了,但仍然發生得很快。另外,我還必須將r​​un()方法添加到新的Runnable中才能使其運行。 – Josh

+0

我爲每次onGloballayout運行添加了一個日誌事件,並且每次它返回0爲我試圖查找的視圖位置。我甚至試着移動布爾切換鍵來切換第一次觸摸屏幕,但視圖仍然返回0.任何想法爲什麼視圖3在列表上位置將返回0爲getTop()和getY()? – Josh