ListView内嵌套RelativeLayout中的垂直居中

Posted

技术标签:

【中文标题】ListView内嵌套RelativeLayout中的垂直居中【英文标题】:Vertical centering in nested RelativeLayout inside a ListView 【发布时间】:2012-11-24 23:46:31 【问题描述】:

我尝试将两个 RelativeLayouts 嵌套为 ListView 的行,并将嵌套布局的内容垂直居中。不管我怎么尝试,我都无法让它工作:

这是我的 XML 布局,我知道它有点乱(也试过 LinearLayouts 没有成功):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_ 
    android:descendantFocusability="blocksDescendants">
    <CheckBox
        android:id="@+id/check"
        android:layout_
        android:layout_
        android:layout_centerVertical="true"
        android:layout_marginTop="2dp"
        />
    <TextView
        android:id="@+id/label"
        android:layout_toRightOf="@id/check"
        android:layout_toLeftOf="@+id/date_time_container"
        android:layout_
        android:layout_
        android:layout_centerVertical="true"
        android:ellipsize="end"
        android:paddingLeft="6dp"
        android:paddingRight="6dp"
        android:singleLine="true"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:bufferType="spannable">
    </TextView>
    <RelativeLayout
        android:id="@+id/date_time_container"
        android:layout_alignParentRight="true"
        android:layout_
        android:layout_
        android:layout_centerVertical="true"
        android:background="@color/grey"
        >
        <TextView
            android:id="@+id/date_time"
            android:layout_toLeftOf="@+id/icon"
            android:layout_
            android:layout_
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:background="@color/green"
            android:layout_marginTop="2dp"
            android:bufferType="spannable"
            android:text="">
        </TextView>
        <ImageView
            android:id="@+id/icon"
            android:layout_toRightOf="@id/date_time"
            android:layout_
            android:layout_
            android:layout_marginLeft="4dp"
            android:layout_marginRight="0dp"
            android:layout_marginTop="2dp"
            android:layout_centerVertical="true"
            android:src="@drawable/urgent" 
            android:contentDescription="@string/icon"/>

    </RelativeLayout>


</RelativeLayout> 

按照其他线程中的建议,我已经确保在适配器中正确填充行:

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) 
    return mInflater.inflate(R.layout.task_row, parent, false);         

有什么想法吗?我敢肯定它一定是小事。谢谢!

编辑: 在 Eclipse 中,布局显示正确,似乎将布局嵌套在 ListView 行中会以某种方式弄乱布局:

编辑 2: 我以为我可以通过使用 EditText 找到某个地方。但是除非有办法让它看起来和 TextView 一样,否则我会回到绘图板上:(

编辑 3: 我终于通过在 TextView 中使用 LinearLayout 和 android:gravity="center_vertical" 来解决它:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_ 
    android:descendantFocusability="blocksDescendants">
    <CheckBox
        android:id="@+id/check"
        android:layout_
        android:layout_
        android:layout_centerVertical="true"
        android:layout_marginTop="2dp"
        />
    <TextView
        android:id="@+id/label"
        android:layout_toRightOf="@id/check"
        android:layout_toLeftOf="@+id/date_time_container"
        android:layout_
        android:layout_
        android:layout_centerVertical="true"
        android:ellipsize="end"
        android:paddingLeft="6dp"
        android:paddingRight="6dp"
        android:singleLine="true"
        android:text="Some text"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:bufferType="spannable">
    </TextView>
    <LinearLayout
        android:id="@+id/date_time_container"
        android:layout_alignParentRight="true"
        android:layout_
        android:layout_
        android:layout_centerInParent="true"

        android:background="@color/grey"
        >
         <TextView
             android:id="@+id/date_time"
            android:layout_
            android:layout_
            android:bufferType="spannable"
            android:singleLine="true"
            android:gravity="center_vertical"
            android:background="@color/green"
            android:text="20:00"
            android:textAppearance="?android:attr/textAppearanceSmall"
             />
        <ImageView
            android:id="@+id/icon"
            android:layout_
            android:layout_
            android:src="@drawable/urgent" 
            android:contentDescription="@string/icon"/>

    </LinearLayout>


</RelativeLayout> 

【问题讨论】:

【参考方案1】:

尝试将根RelativeLayout内视图的layout_height设置为wrap_content

【讨论】:

谢谢,但我仍然得到相同的结果,TextView 在左上角而不是居中。 奇怪,我试过了,它有效。请注意,存在循环依赖,您必须删除行 android:layout_toLeftOf="@+id/icon" 我按照您的建议更改了布局,但没有任何改变。问题似乎是在 ListView 内,LayoutParams 无法正常工作。我实现了 SimpleCursorAdapter 的子类,并且布局在 newView() 中膨胀。 Eclipse 中的图形布局选项卡显示布局正确。 感谢您的宝贵时间,我找到了解决方法,请参阅原始帖子。

以上是关于ListView内嵌套RelativeLayout中的垂直居中的主要内容,如果未能解决你的问题,请参考以下文章

可滚动父版面内的不可滚动ListView

ScrollView内嵌套ListView时的显示与滑动问题

Flutter - 可重新排序的列表,Listview 嵌套在 expandtile 内

RelativeLayout 中的 ListView 填满整个高度

RelativeLayout作为listview项目

自定义ListView的RelativeLayout中的Android布局居中