Android自定义视图进入scrollView不显示

时间:2016-04-21 13:47:38

标签: android scrollview android-custom-view

我正在尝试将自定义视图放入scrollView。这是我的自定义视图MyCustomLayout.java

public class MyCustomLayout extends ViewGroup {

private static final int UNEVEN_GRID_PENALTY_MULTIPLIER = 10;

private int mMaxChildWidth = 0;
private int mMaxChildHeight = 0;

public MyCustomLayout(Context context) {
    super(context, null);
}

public MyCustomLayout(Context context, AttributeSet attrs) {
    super(context, attrs, 0);
}

public MyCustomLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    mMaxChildWidth = 0;
    mMaxChildHeight = 0;

    int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
            MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST);
    int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
            MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST);

    final int count = getChildCount();
    for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        if (child.getVisibility() == GONE) {
            continue;
        }

        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);

        mMaxChildWidth = Math.max(mMaxChildWidth, child.getMeasuredWidth());
        mMaxChildHeight = Math.max(mMaxChildHeight, child.getMeasuredHeight());
    }

    childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(
            mMaxChildWidth, MeasureSpec.EXACTLY);
    childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(
            mMaxChildHeight, MeasureSpec.EXACTLY);

    for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        if (child.getVisibility() == GONE) {
            continue;
        }

        child.measure(childWidthMeasureSpec, childHeightMeasureSpec);
    }

    setMeasuredDimension(
            resolveSize(mMaxChildWidth, widthMeasureSpec),
            resolveSize(mMaxChildHeight, heightMeasureSpec));
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    int width = r - l;
    int height = b - t;

    final int count = getChildCount();

    // Calculate the number of visible children.
    int visibleCount = 0;
    for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        if (child.getVisibility() == GONE) {
            continue;
        }
        ++visibleCount;
    }

    if (visibleCount == 0) {
        return;
    }

    int bestSpaceDifference = Integer.MAX_VALUE;
    int spaceDifference;

    int hSpace = 0;
    int vSpace = 0;

    int cols = 1;
    int rows;

    while (true) {
        rows = (visibleCount - 1) / cols + 1;

        hSpace = ((width - mMaxChildWidth * cols) / (cols + 1));
        vSpace = ((height - mMaxChildHeight * rows) / (rows + 1));

        spaceDifference = Math.abs(vSpace - hSpace);
        if (rows * cols != visibleCount) {
            spaceDifference *= UNEVEN_GRID_PENALTY_MULTIPLIER;
        }

        if (spaceDifference < bestSpaceDifference) {
            bestSpaceDifference = spaceDifference;
            if (rows == 1) {
                break;
            }
        } else {
            --cols;
            rows = (visibleCount - 1) / cols + 1;
            hSpace = ((width - mMaxChildWidth * cols) / (cols + 1));
            vSpace = ((height - mMaxChildHeight * rows) / (rows + 1));
            break;
        }

        ++cols;
    }

    hSpace = Math.max(0, hSpace);
    vSpace = Math.max(0, vSpace);

    width = (width - hSpace * (cols + 1)) / cols;
    height = (height - vSpace * (rows + 1)) / rows;

    int left, top;
    int col, row;
    int visibleIndex = 0;
    for (int i = 0; i < count; i++) {
        final View child = getChildAt(i);
        if (child.getVisibility() == GONE) {
            continue;
        }

        row = visibleIndex / cols;
        col = visibleIndex % cols;

        left = hSpace * (col + 1) + width * col;
        top = vSpace * (row + 1) + height * row;

        child.layout(left, top,
                (hSpace == 0 && col == cols - 1) ? r : (left + width),
                (vSpace == 0 && row == rows - 1) ? b : (top + height));
        ++visibleIndex;
    }
 }
}

当我在LinearLayout中使用那些xml代码时。它工作正常。

<com.crazyCoder.androiddeshboard.MyCustomLayout
    android:id="@+id/layout_custom"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#f8f9fe" >
</com.crazyCoder.androiddeshboard.MyCustomLayout>

但是当我像这样放入一个scrollView时

<ScrollView
    android:id="@+id/scrollview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffd9f4">

    <com.crazyCoder.androiddeshboard.MyCustomLayout
        android:id="@+id/layout_custom"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#f8f9fe" >
    </com.crazyCoder.androiddeshboard.MyCustomLayout>

</ScrollView>

scrollView重叠的自定义视图。像这样的输出。

ScrollView Output

请帮帮我。提前谢谢。

1 个答案:

答案 0 :(得分:0)

尝试在ScrollView中放置FrameLayout并将MyCustomLatyout放在FrameLayout中。

private static <T extends HomerMessage> HomerMessage postRequest(String path, HomerMessage json) throws IOException, HomerDoh
{
    RequestBody body = RequestBody.create(JSON, toJson(json));
    Request request = new Request.Builder().url("http://" + path).post(body).build();

    String response = new OkHttpClient().newCall(request).execute().body().string();
    System.out.println(response);
    JsonNode responseNode = new ObjectMapper().readValue(response, JsonNode.class);
    if(!"200".equals(responseNode.get("status")))
    {
        throw readData(response, new TypeReference<HomerDoh>() {});
    }
    return readData(response, new TypeReference<T>() {});
}

private static <T> T readData(String is, TypeReference<T> ref) throws IOException
{
    return mapper.readValue(is, ref);
}