在GridView行中测量最终的ImageView宽度

时间:2015-02-17 13:19:19

标签: android gridview

将ImageView添加到GridView项目(适配器)时,我想知道ImageView在屏幕上呈现时的最终宽度,因此我可以将TextView调整为ImageView的确切大小。但是,当将ImageView作为GridView项添加时,基于GridView的可用宽度,ImageView将被调整大小/缩放并使用额外的填充/边距进行定位。

示例:

gridview

假设文本仅覆盖ImageView,而不是跨越容器的整个宽度。

上面的图片呈现如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="wrap_content"
            android:layout_height="match_parent">

<net.ninefigures.caspertv.widget.SizeAwareImageView
    android:id="@+id/thumbnail"
    android:layout_height="match_parent"
    android:layout_width="wrap_content"
    android:src="@drawable/mqdefault"/>

<net.ninefigures.caspertv.widget.SourceSansProTextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleLine="false"
    android:maxLines="2"
    android:layout_alignBottom="@id/preview"
    android:text="Lorum Ipsum Dolor Sit Amit"/>

</RelativeLayout>

尝试使用以下内容测量网格项的getView中的ImageView宽度:

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

    ...

    final TextView title = (TextView) convertView.findViewById(R.id.title);
    final ImageView thumbnail = (ImageView) convertView.findViewById(R.id.thumbnail);

    ViewTreeObserver viewTreeObserver = thumbnail.getViewTreeObserver();
        if(viewTreeObserver.isAlive()) {
            viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    ViewTreeObserver viewTreeObserver = thumbnail.getViewTreeObserver();

                    if (viewTreeObserver.isAlive()) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                            viewTreeObserver.removeOnGlobalLayoutListener(this);
                        } else {
                            viewTreeObserver.removeGlobalOnLayoutListener(this);
                        }
                    }

                    Log.d(TAG, String.format("MeasuredHeight:  %d", thumbnail.getHeight()));
                    Log.d(TAG, String.format("MeasuredWidth:  %d", thumbnail.getWidth()));
                }
            });
        }

然而,这总是返回0;

有关如何测量ImageView最终宽度的任何想法?

2 个答案:

答案 0 :(得分:0)

尝试内部

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
}

将在渲染视图后调用它。

答案 1 :(得分:0)

显然,技巧是在渲染之前显式测量ImageView的宽度/高度。

thumbnail.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
title.setWidth(thumbnail.getMeasuredWidth());