0

我正在创建一个 ListView,它有一些静态标题,如下图所示:

在此处输入图像描述

我希望标题列(日期、状态、纬度和经度)根据相应列的宽度调整其宽度。

我正在尝试获取与适配器关联的列表项的布局,以便我可以在我的 ListActivity 中找到其子项的宽度(但这似乎是不可能的)。

然后我尝试在我的自定义 ArrayAdapter 的 getView 方法中检索与列表项关联的每个 TextView 的宽度,如下面的代码所示:(但它返回 null,我认为在重新编辑 textView 之前它无法返回宽度。)

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    DispatchHolder holder = null;
    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new DispatchHolder();
        holder.tvcurrentDateTime = (TextView) row
                .findViewById(R.id.tvCurrentDateTimeLog);
        holder.tvAction = (TextView) row.findViewById(R.id.tvActionLog);
        holder.tvLatitude = (TextView) row.findViewById(R.id.tvlatitudeLog);
        holder.tvLongitude = (TextView) row
                .findViewById(R.id.tvlogitudeLog);

        row.setTag(holder);
    } else {
        holder = (DispatchHolder) row.getTag();
    }
    holder.tvcurrentDateTime.setText(data.get(position).getTime());
    int i = holder.tvcurrentDateTime.getWidth()    <------- Here it is return 0
    holder.tvAction.setText(data.get(position).getAction());
    holder.tvLatitude.setText(data.get(position).getLatitude());
    holder.tvLongitude.setText(data.get(position).getLogitude());

    return row;
}

我已经搜索过了,但我找不到这样做的方法。

以下是相关代码:

我的列表活动:

public class Activity_Log extends ListActivity {

PickupStatusDao puDao;
LogAdapter adapter;
List<LogModel> listOfDispatch;
private Object mItem;
private View childView;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_log_xml);

    puDao = new PickupStatusDao(this);
    List<LogModel> lstResult = puDao.readAllLogData();
    adapter = new LogAdapter(this, R.layout.log_item_row, lstResult);

    setListAdapter(adapter);

}

}

我的 list_item (R.layout.log_item_row):

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

<TableLayout
    android:id="@+id/BodyTable"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TableRow
        android:id="@+id/tableRow2"
        style="@style/BodyRow"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/tvCurrentDateTimeLog"
            style="@style/BodyText"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="this time"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/tvActionLog"
            style="@style/BodyText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="this is action"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/tvlogitudeLog"
            style="@style/BodyText"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="logitude"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/tvlatitudeLog"
            style="@style/BodyText"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="latuide"
            android:textSize="20sp" />
    </TableRow>
</TableLayout>

列出活动布局 (R.layout.activity_log_xml)

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TableLayout
        android:id="@+id/HeaderTable"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <TableRow style="@style/HeaderRow" >

            <TextView
                style="@style/HeaderText"
                android:layout_width="239dp"
                android:text="Date" />

            <TextView
                style="@style/HeaderText"
                android:layout_width="156dp"
                android:text="Status" />

            <TextView
                style="@style/HeaderText"
                android:layout_width="121dp"
                android:text="Latitude" />

            <TextView
                style="@style/HeaderText"
                android:layout_width="121dp"
                android:text="Longitude" />
        </TableRow>
    </TableLayout>

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" >
    </ListView>

</LinearLayout>
4

2 回答 2

1

不幸的是,这不是您可以使用AdapterView. 由于它们将任意长度的数据源捆绑在一起,但在任何时候只显示数据的一小部分,因此在不测量每条数据的视图的情况下,没有有效的方法来确定数据的最大宽度。

我建议在初始化数据源时做一些工作以找到将显示的文本的平均长度,并将每列设置为对数据有意义的某个值。或者,只需对每一列使用相同的值(可能是 layout_weights 的某种组合或一些硬编码值)。

于 2013-09-17T07:20:27.633 回答
1

我通过 XMLandroid:layout_weight属性实现了这一点,它适用于具有不同密度的所有 android 设备,这是更新后的 UI 图片:

在此处输入图像描述

ListActivity ( activity_log_xml.xml ) 和 list_item ( log_item_row.xml )的更新 XML分别如下:

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

<TableLayout
    android:id="@+id/HeaderTable"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TableRow
        style="@style/HeaderRow"
        android:weightSum="10" >

        <TextView
            android:id="@+id/dateHeaderTV"
            style="@style/HeaderText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="3"
            android:text="Date" />

        <TextView
            android:id="@+id/statusHeaderTV"
            style="@style/HeaderText"
            android:layout_width="0dp"
            android:layout_weight="4"
            android:text="Status" />

        <TextView
            android:id="@+id/latitudeHeaderTV"
            style="@style/HeaderText"
            android:layout_width="0dp"
            android:layout_weight="1.5"
            android:text="Latitude" />

        <TextView
            android:id="@+id/longitudeHeaderTV"
            style="@style/HeaderText"
            android:layout_width="0dp"
            android:layout_weight="1.5"
            android:text="Longitude" />
    </TableRow>
</TableLayout>

<ListView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" >
</ListView>


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

<TableLayout
    android:id="@+id/BodyTable"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TableRow
        android:id="@+id/tableRow2"
        style="@style/BodyRow"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="10" >

        <TextView
            android:id="@+id/tvCurrentDateTimeLog"
            style="@style/BodyText"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="3"
            android:text="this time" />

        <TextView
            android:id="@+id/tvActionLog"
            style="@style/BodyText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="4"
            android:text="this is action" />

        <TextView
            android:id="@+id/tvlogitudeLog"
            style="@style/BodyText"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1.5"
            android:text="logitude" />

        <TextView
            android:id="@+id/tvlatitudeLog"
            style="@style/BodyText"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1.5"
            android:text="latuide" />
    </TableRow>
</TableLayout>

于 2013-09-17T11:19:37.893 回答