在TableLayout中移动TableRow时出现问题

时间:2011-07-25 12:32:53

标签: android android-layout tablelayout

我试图在特定视图中根据用户输入动态地动态移动几行。

用例是用户选择一个选项并根据选项显示/隐藏某些行,并且需要重新排列行以使用户有意义。

TableLayoutXML已实例化,但TableRow及其布局在代码中实例化。我尝试了几种不同的方法,取得了不同程度的成功。

适用于隐藏/禁用的代码:

private void updateTimeRow(TargetType goalTarget)
{
    TableRow timeRow = (TableRow)this.findViewById(timeId + 100);
    EditText timeText = (EditText)this.findViewById(timeId);
    if (goalTarget == TargetType.daysRowedWeek
            || goalTarget == TargetType.metersDay
            || goalTarget == TargetType.metersSeason
            || goalTarget == TargetType.metersWeek)
    {
        timeRow.setVisibility(View.GONE);
        timeRow.setEnabled(false);
        timeText.setEnabled(false);
    }
    else if (goalTarget == TargetType.splitForDistance
            || goalTarget == TargetType.unknown)
    {
        setTimeText(currentTarget.recalcTime().toString());
        timeRow.setVisibility(View.VISIBLE);
        timeRow.setEnabled(false);
        timeText.setEnabled(false);
    }
    else
    {
        timeRow.setVisibility(View.VISIBLE);
        timeRow.setEnabled(true);
        timeText.setEnabled(true);
    }
}    

基于此处回答的问题,我尝试使用以下代码删除/重新添加行:

    int rowNum = -1;
    tableLayout.removeView(timeRow);
    switch (goalTarget)
    {
    case unknown:
    case timeForDistance:
        rowNum = 2;
        break;
    case splitForDistance:
        rowNum = 4;
        break;
    case splitForTime:
        rowNum = 3;
        break;
    }
    tableLayout.addView(timeRow, rowNum);

这里有两件事:

  • 禁用代码失败(此代码是否在上面的启用/禁用代码之后运行
  • 布局中的行全部搞砸了。

那么,如何动态地移动行,同时正确隐藏/显示/启用/禁用不同的行?

1 个答案:

答案 0 :(得分:0)

在经历了许多令人沮丧的反复试验之后,我终于想出了实现这一目标的唯一方法:

我必须调整我的UI更新方式,分为3个步骤:   - 更新输入的值(强制格式化,重新计算等)   - 重新布局行   - 根据选择启用/禁用不同的输入

我必须从goalTarget删除所有TableRow并添加

TableLayout更改{

他们以正确的顺序返回,并将相应的行号作为addView()来电的一部分。

这绝对不是我能看到它完成的最漂亮的方式,但显然TableLayout不喜欢你只是尝试

一次移动一个东西。