如何从屏幕右侧开始将`ListView`项设置为wrap_content?

时间:2013-04-26 00:03:09

标签: java android xml android-custom-view

我有一个ListView,它有一个自定义适配器来提供自定义的View。每个列表项“更改”它所在屏幕的一侧(就像您在垂直轴上翻转它一样)。这是我正在谈论的一个例子:

enter image description here

照片中较暗的灰色框覆盖了ProfilePictureViewTextView,其中包含用户名和照片。如果用户未登录,则没有姓名和照片(如照片中的第二个列表项所示)。正如您从照片中看到的那样,背景图像环绕视图中第一个和第三个项目的内容(从左侧开始到右侧结束)。问题是:面向的项目另一种方式是忽略我的“wrap_content”调用并“匹配”父视图(如第二项所示)。我相信它正确地包装了内容,但有没有办法从屏幕右侧开始并将内容包装到左侧?

以下是该项目视图的XML代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="right|center_vertical">

<LinearLayout 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_alignParentRight="true"
    android:gravity="right" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <com.namespace.RobotoTextView
            android:id="@+id/list_item_user_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="24sp"
            android:textStyle="bold"
            android:textColor="@color/white"
            custom:typeface="roboto_light"/>

        <com.namespace.RobotoTextView
            android:id="@+id/list_item_user_score"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="36sp"
            android:textStyle="bold"
            android:textColor="@color/waf_warm_yellow_orange"
            custom:typeface="roboto_bold"/>

    </LinearLayout>

    <com.facebook.widget.ProfilePictureView
            android:id="@+id/list_item_user_image"
            android:layout_width="69dp"
            android:layout_height="69dp"
            android:layout_margin="10dp" />

</LinearLayout>

那么,如何正确地将视图正确对齐并使背景图像正确地环绕其内容?

2 个答案:

答案 0 :(得分:1)

为左右创建单独的列表项布局。在你的适配器......

@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    return position % 2;
}

public View getView(int position, View convertView, ViewGroup parent) {
    int viewType = getItemViewType(position);
    int layoutRes = viewType == 0 ? R.layout.list_item_left : R.layout.list_item_right;

    View row = inflater.inflate(layoutRes);
    /* ... */
}

基本上,您的适配器报告两种不同的视图类型,并且您的getView在它们之间交替显示。 (如果还有其他一些逻辑来确定左右对,请在getItemViewType()中实现。)

答案 1 :(得分:0)

我的问题的答案很简单,在我的自定义适配器中,我正在设置背景图像资源,具体取决于它是偶数还是奇数列表视图项。而不是这样做我只需要制作一个imageview并将该图像资源设置为背景图像,并使用android:layout_alignParentRight="true和`android:layout_alignParentLeft =“true”属性将其设置到屏幕的正确一侧。