2012-11-12 77 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