android - 从互联网加载图像后,Viewpager 不包装内容

标签 android android-layout android-viewpager

我有一个 viewpager,它保存由 Nostra 的通用图像加载器加载的图像。此 viewpager 也是 ListView 的一部分作为标题。将高度设置为 wrap_content 不起作用,它什么也不显示,但如果我将它设置为特定的倾角,它就会起作用。我怀疑 viewpager 在加载图像之前会包装其内容,因此它不会显示任何内容。

这是布局:

<?xml version="1.0" encoding="utf-8"?>

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:layout_marginRight="16dp"
    android:layout_marginLeft="16dp"
    android:layout_marginTop="16dp">

    <android.support.v4.view.ViewPager
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@id/viewpager"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <com.sblive.other.CirclePageIndicator
        android:id="@+id/titles"
        android:layout_height="wrap_content"
        android:layout_width="fill_parent"
        android:layout_marginBottom="3dp"
        android:layout_gravity="center_horizontal|bottom"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_centerHorizontal="true"/>

    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/progressBar"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

ViewPager 的 PagerAdapter 的一部分:

@Override
public Object instantiateItem(ViewGroup container, int position) {

    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = inflater.inflate(R.layout.header_item, container,false);
    ImageView img = (ImageView) itemView.findViewById(R.id.imageView);
    ProgressBar progressBar = (ProgressBar) itemView.findViewById(R.id.progressBar);
    display(img, list.get(position), progressBar);
    ((ViewPager) container).addView(itemView);
    return itemView;
}

最佳答案

当使用 "wrap_content" 时, View 不会重新计算高度(或宽度)。因此,当动态添加项目时,它不会自行刷新。您可以称之为 Android 的限制。

您可以重新计算它的高度,并通过覆盖 viewPager 的 onMeasure 方法将其设置为最大的 child 。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    int height = 0;
    for(int i = 0; i < getChildCount(); i++) {
        View child = getChildAt(i);
        child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
        int h = child.getMeasuredHeight();
        if(h > height) height = h;
    }

    heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

您也可以将其设置为等于 viewpager 的第一个 child 的高度。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    View child = getChildAt(0);
    child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
    int height = child.getMeasuredHeight();

    heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

根据您要实现的目标,您还可以适本地使用 layout_weight 来使 viewpager 占用父级中的剩余空间。

关于android - 从互联网加载图像后,Viewpager 不包装内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21513604/

相关文章:

java - 类路径或引导类路径中的 Gradle + Retrolambda : Fatal Error: Unable to find package java. lang

android - 如何在 Android 的 ViewPager 中增加 child 的宽度?

具有视差背景图像的 Android ViewPager

android - 飞行模式下的主动蓝牙

Android onActivityResult 从未从 Fragment 中的 DialogFragment 调用过

android - 具有 "enabled/selected"边框的水平线性布局

android - BottomSheet 自定义行为 - 在 BottomBar 之上

android-fragments - Activity 被销毁时 ViewPager 和 FragmentStatePagerAdapter 出现问题

Android - 启动时崩溃

Android:配置 .xml 必须同意根元素的 ID