我试图在特定视图中根据用户输入动态地动态移动几行。
用例是用户选择一个选项并根据选项显示/隐藏某些行,并且需要重新排列行以使用户有意义。
TableLayout
中XML
已实例化,但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);
这里有两件事:
那么,如何动态地移动行,同时正确隐藏/显示/启用/禁用不同的行?
答案 0 :(得分:0)
在经历了许多令人沮丧的反复试验之后,我终于想出了实现这一目标的唯一方法:
我必须调整我的UI更新方式,分为3个步骤: - 更新输入的值(强制格式化,重新计算等) - 重新布局行 - 根据选择启用/禁用不同的输入
我必须从goalTarget
删除所有TableRow
并添加
TableLayout
更改{
他们以正确的顺序返回,并将相应的行号作为addView()
来电的一部分。
这绝对不是我能看到它完成的最漂亮的方式,但显然TableLayout
不喜欢你只是尝试
一次移动一个东西。