Android:布局后在屏幕上获取ListView项目位置

时间:2012-11-12 23:33:04

标签: android listview

我目前正在开发一个功能类似于Roman Nurik的粘性scrollview技术的片段:

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,直到它滚出屏幕一次?之后一切都很好。

有什么建议吗?

谢谢, 约什

2 个答案:

答案 0 :(得分:3)

好的,我觉得错过这个很傻,但这里是:

在我的布局的xml中,我将ListView设置为wrap_content而不是fill_parent。我花了很多时间查看片段编码,我从未考虑过检查布局。

感谢弗拉维奥,因为看起来他的答案应该有效,但最终是不必要的。

答案 1 :(得分: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;
            }
        });    
    }
});