ListView中的OnGlobalLayoutListener

nha*_*man 10 android android-layout

我希望能够通过动画扩展ListView中的行.因此,我需要知道正在扩展的视图的高度.我在我的getView()方法中使用它ArrayAdapter:

mDetailsView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {
        mDetailsView.getViewTreeObserver().removeGlobalOnLayoutListener(this);

        onClickListener.setHeight(mDetailsView.getHeight());
        mDetailsView.setVisibility(View.GONE);
    }
});
Run Code Online (Sandbox Code Playgroud)

这适用于在开始时在屏幕上可见的行,但是当我向下滚动时,onGlobalLayout不会为最初不可见的行调用该方法.

如何获得这些行的高度?

Dee*_*eeV 13

有可能实现ListView不执行整个布局,因此ViewTreeObserver从不实际看到正在进行的布局.

除非有一些我不知道的特定手机外壳,你可以使用postViews中的方法在它们处于可见状态时执行runnable.

mDetailsView.post(new Runnable() {
  @Override
  public void run() {
    onClickListener.setHeight(mDetailsView.getHeight());
    mDetailsView.setVisibility(View.GONE);
  }
});
Run Code Online (Sandbox Code Playgroud)

编辑:

我不知道整个getView()方法是如何布局的.如果我不得不猜测,这个问题ListView就是没有要求布局.相反,它正在为每个视图自己完成工作以加快速度.您可以尝试的是:

public void getView(int position, View convertView, ViewGroup parent) {

  /* 
   * set your view up
   */

  mDetailsView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

    @Override
    public void onGlobalLayout() {
        mDetailsView.getViewTreeObserver().removeGlobalOnLayoutListener(this);

        onClickListener.setHeight(mDetailsView.getHeight());
        mDetailsView.setVisibility(View.GONE);
       }
   });

   notifyDataSetInvalidated(); // Notify the ListView() and any other listeners that your views are invalid.
   return view;
}
Run Code Online (Sandbox Code Playgroud)

新编辑:notifyDataSetInvalidated()通常使用一个坏主意,尤其是在使用时getView().

要预先测量布局,您可以使用布局参数,如果它们不存在则给它新的布局参数.

    LayoutParams params = newView.getLayoutParams();
    if (params == null) {
        params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    }
    final int widthSpec = MeasureSpec.makeMeasureSpec(parent.getWidth(), MeasureSpec.UNSPECIFIED);
    final int heightSpec = MeasureSpec.makeMeasureSpec(parent.getHeight(), MeasureSpec.UNSPECIFIED);
    newView.measure(widthSpec, heightSpec);
Run Code Online (Sandbox Code Playgroud)


Bys*_*ysz 7

在ListView或RecyclerView而不是使用OnGlobalLayoutListener我总是使用OnPreDrawListener.对于启动时的非可见行,也会触发此回调.从官方文档:

此时,树中的所有视图都已经过测量并给出了一个框架.