在android中,可扩展列表视图的最后一行不是全视图

红色标记行视图

这里我使用view和there代码,如下所示。

<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TableRow android:id="@+id/tab_stone_info" android:layout_width="match_parent" android:layout_height="30dp" android:layout_marginTop="1dp" android:background="@color/styleBreakTabColor" android:weightSum="9"> <TextView android:id="@+id/stone_Type" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/cell_shape" android:gravity="center" android:text="@string/Type" android:textColor="@color/txtStyleBreakup" android:textSize="12sp" /> <TextView android:id="@+id/stone_Shape" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/cell_shape" android:gravity="center" android:text="@string/Shape" android:textColor="@color/txtStyleBreakup" android:textSize="12sp" /> <TextView android:id="@+id/stone_Qlty" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/cell_shape" android:gravity="center" android:text="@string/Quality" android:textColor="@color/txtStyleBreakup" android:textSize="12sp" /> <TextView android:id="@+id/stone_Grade" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/cell_shape" android:gravity="center" android:text="@string/Grade" android:textColor="@color/txtStyleBreakup" android:textSize="12sp" /> <TextView android:id="@+id/stone_Qty" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/cell_shape" android:gravity="center" android:text="@string/Qty" android:textColor="@color/txtStyleBreakup" android:textSize="12sp" /> <TextView android:id="@+id/stone_Wt" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/cell_shape" android:gravity="center" android:text="@string/Wt" android:textColor="@color/txtStyleBreakup" android:textSize="12sp" /> <TextView android:id="@+id/stone_MMSize" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/cell_shape" android:gravity="center" android:text="@string/MMSize" android:textColor="@color/txtStyleBreakup" android:textSize="12sp" /> <TextView android:id="@+id/stone_Setting" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/cell_shape" android:gravity="center" android:text="@string/Setting" android:textColor="@color/txtStyleBreakup" android:textSize="12sp" /> <TextView android:id="@+id/stone_SettMode" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="@drawable/cell_shape" android:gravity="center" android:text="@string/SettingMode" android:textColor="@color/txtStyleBreakup" android:textSize="12sp" /> </TableRow> <RelativeLayout android:id="@+id/layout_tab_stone_info_value" android:layout_width="match_parent" android:layout_height="match_parent" > <com.mindtech.ExpandableHeightListView android:id="@+id/listviewstone" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="#00000000" android:gravity="center" android:horizontalSpacing="2dp" android:isScrollContainer="false" android:stretchMode="columnWidth" android:verticalSpacing="20dp" /> </RelativeLayout> </LinearLayout> 

我使用epandablelistview作为下面的类。

 public class ExpandableHeightListView extends ListView { boolean expanded = false; public ExpandableHeightListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public ExpandableHeightListView(Context context) { super(context); } public ExpandableHeightListView(Context context, AttributeSet attrs) { super(context, attrs); } public boolean isExpanded() { return expanded; } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, // MeasureSpec.AT_MOST); // // super.onMeasure(widthMeasureSpec, expandSpec); // int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec( // Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); // super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom); // ViewGroup.LayoutParams params = getLayoutParams(); // params.height = getMeasuredHeight(); if (isExpanded()) { int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, 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; } } 

我提到这个问题,但没有得到正确的答案。 ScrollView中的图像网格

Gridview高度被削减

主要问题发生在第一排高度不比第二排或其他更高的时候。 如果所有的行内容长度相同,则没有问题。

Solutions Collecting From Web of "在android中,可扩展列表视图的最后一行不是全视图"

它看起来像你得到你的ListView的LayoutParams,修改高度参数,但你永远不会调用setLayoutParams告诉视图使用修改后的高度。 尝试这个:

 if (isExpanded()) { int expandSpec = MeasureSpec.makeMeasureSpec(MEASURED_SIZE_MASK, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); ViewGroup.LayoutParams params = getLayoutParams(); params.height = getMeasuredHeight(); //Add this line setLayoutParams(params); } 

另外,我用onMeasure()方法遇到了问题,当框架调用这个方法时,并不是所有东西都被测量。 你可以尝试一个ViewTreeObserver ,在这里你可以注册一个监听器,在完整的视图布局时得到通知,如下所示:

 final LinearLayout layout = (LinearLayout) findViewById(R.id.layout_id); ViewTreeObserver vto; if (layout != null) { vto = layout.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { layout.getViewTreeObserver().removeOnGlobalLayoutListener(this); //Modify your LayoutParams here } }); } 

如果只有一个孩子,那么最好使用ExpandableListViewRecyclerView以不同的layouts 。 这是一个关于使用ExpandableListView的完整和非常好的教程。

在使用ListView ,它的高度总是比原来的高(或者可能还有另外一种情况,但是我不知道为什么,如果有人知道的话,请不要纠正我)。 所以你必须在最后手动添加一些dp's高度。

我通过重写onDraw方法来完成它。 以下是我如何做到的。

 @Override protected void onDraw(Canvas canvas) { params = getLayoutParams(); if (getCount() != old_count) { old_count = getCount(); params.height = getCount() * (old_count > 0 ? getChildAt(0).getHeight()+5 : 0); //I've added 5 pixels with each item to get proper height, you can alter it as per your need setLayoutParams(params); } super.onDraw(canvas); } 

您正在修改高度,但是您没有将其传递到视图。

使用这个方法,setLayoutParams(params);