gpt4 book ai didi

java - 如何在android java中将多个gridviews添加到一个scrollview?

转载 作者:行者123 更新时间:2023-11-29 09:56:32 26 4
gpt4 key购买 nike

我正在尝试在运行时将多个 GridView 添加到线性布局中的 ScrollView 。但只显示第一行。请帮忙

最佳答案

您不能在 Android 中嵌套可 ScrollView - 即 ListView、GridView、ScrollView。

你可以看看下面的代码:

import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewGroup;
import android.widget.GridView;

public class ScrollableGridView extends GridView {
boolean expanded = true;

public ScrollableGridView(Context context)
{
super(context);
}

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

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

public boolean isExpanded()
{
return expanded;
}


@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
// HACK! TAKE THAT ANDROID!
if (isExpanded())
{
// Calculate entire height by providing a very large height hint.
// But do not use the highest 2 bits of this integer; those are
// reserved for the MeasureSpec mode.
int expandSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);

ViewGroup.LayoutParams params = getLayoutParams();
params.height = getMeasuredHeight();
}
else
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}

public void setExpanded(boolean expanded)
{
this.expanded = expanded;
}
}

它是 GridView 的一个更好的版本,允许它在嵌套在 ScrollView 中时几乎可以工作。我说“差不多可以”是因为我发现它有时会太短或太长 20-30 像素。您应该注意,这会阻止 View 被重用,因此它比普通的 GridView 重得多。

在我的例子中,我最终扩展了 LinearLayout 并使用它来对齐列中的子元素。这并不难——如果你愿意,我可以给你举个例子。 :)

我从 this answer 得到了 GridView 示例.

下面是一个基于 LinearLayout 的 GridView 的例子:

import java.util.List;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

public class GridLikeLayout extends LinearLayout {
private static final int DEFAULT_ITEMS_PER_ROW = 1;
private final int DEFAULT_COLUMN_WIDTH = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 150, getContext().getResources()
.getDisplayMetrics());

private int itemsPerRow = DEFAULT_ITEMS_PER_ROW;
private List<View> innerViews = null;

private int columnWidth;

public GridLikeLayout(Context context, AttributeSet attrs) {
super(context, attrs);

TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.GridLikeLayout);

// itemsPerRow = a.getInt( R.styleable.GridLikeLayout_columns,
// DEFAULT_ITEMS_PER_ROW);

try {
columnWidth = (int) a.getDimension(
R.styleable.GridLikeLayout_column_width, DEFAULT_COLUMN_WIDTH);
} catch (UnsupportedOperationException uoe) {
columnWidth = (int) a.getInt(
R.styleable.GridLikeLayout_column_width, DEFAULT_COLUMN_WIDTH);
}

setOrientation(LinearLayout.VERTICAL);
}

public GridLikeLayout(Context context) {
super(context);
setOrientation(LinearLayout.VERTICAL);
}

public void setInnerViews(List<View> innerViews) {
this.innerViews = innerViews;
processViews();
}

public List<View> getInnerViews() {
return innerViews;
}

protected void processViews() {
if (null != innerViews) {
LinearLayout innerContainer = null;
innerContainer = generateInnerContainer();
int childrenCount = innerViews.size();
for (int index = 0; index < childrenCount; ++index) {
if (isFull(innerContainer)) {
addInnerContainer(innerContainer);
innerContainer = generateInnerContainer();
}
View child = innerViews.get(index);
if (null != child.getParent()) {
((ViewGroup) child.getParent()).removeView(child);
}
addInnerView(innerContainer, child);
}

addInnerContainer(innerContainer);
}
}

protected boolean isFull(LinearLayout innerContainer) {
return 0 == (innerContainer.getChildCount() % itemsPerRow)
&& 0 < innerContainer.getChildCount();
}

protected void addInnerView(LinearLayout innerContainer, View child) {
int width = LayoutParams.WRAP_CONTENT;
int height = LayoutParams.WRAP_CONTENT;
LayoutParams innerParams = new LayoutParams(width, height);
innerParams.weight = 1;
innerParams.gravity = Gravity.CENTER;
innerContainer.addView(child, innerParams);
}

protected void addInnerContainer(LinearLayout innerContainer) {
LayoutParams params = generateDefaultLayoutParams();
params.width = LayoutParams.MATCH_PARENT;
addView(innerContainer, params);
}

protected LinearLayout generateInnerContainer() {
LinearLayout innerContainer;
innerContainer = new LinearLayout(getContext());
innerContainer.setGravity(Gravity.CENTER);
return innerContainer;
}

public void setOnInnerViewClickListener(OnClickListener listener) {
for (View innerView : innerViews) {
innerView.setOnClickListener(listener);
}
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// Sets up mListPadding
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);

if (widthMode == MeasureSpec.UNSPECIFIED) {
if (columnWidth > 0) {
widthSize = columnWidth + getPaddingLeft() + getPaddingRight();
} else {
widthSize = getPaddingLeft() + getPaddingRight();
}
widthSize += getVerticalScrollbarWidth();
}

int childWidth = widthSize - getPaddingLeft() - getPaddingRight();
int columnsNumber = determineColumns(childWidth);
if (columnsNumber > 0 && columnsNumber != itemsPerRow) {
itemsPerRow = columnsNumber;
removeAllViews();
processViews();
}
}

protected int determineColumns(int availableSpace) {
int columnsNumber = itemsPerRow;
if (0 < columnWidth) {
columnsNumber = availableSpace / columnWidth;
}
return columnsNumber;
}

}

这是我的自定义属性的资源文件:

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

<attr name="column_width" format="dimension|integer">
<enum name="single_column" value="-1" />
</attr>
<declare-styleable name="GridLikeLayout">
<attr name="column_width" />
</declare-styleable>

</resources>

这是一个用法示例:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layoutContainer"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<ScrollView
android:id="@+id/itemsScroller"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<LinearLayout
android:id="@+id/itemsLayout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

<your_package.view.GridLikeLayout
xmlns:my="YOUR APPLICATION PACKAGE"
android:id="@+id/MyGrid"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
my:column_width="260dp"
android:focusable="true"
android:gravity="center_horizontal"
android:padding="5dp" >
</your_package.GridLikeLayout>

<View
android:id="@+id/viewSeparator"
android:layout_width="fill_parent"
android:layout_height="2dp" />

<your_package.GridLikeLayout
xmlns:my="YOUR APPLICATION PACKAGE"
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
my:column_width="single_column" >
</your_package.GridLikeLayout>

</LinearLayout>
</ScrollView>

</FrameLayout>

如果您在运行该示例时遇到任何问题,请告诉我 - 我目前无法尝试。所以如果你有问题,我会稍后检查。不要忘记更改包名称 - “your_package”应该是您存储 GridLikeLayout 的包,“YOUR APPLICATION PACKAGE”是您应用程序的包 - 在应用程序 list 中指定的包。 :)

关于java - 如何在android java中将多个gridviews添加到一个scrollview?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9889255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com