繁体   English   中英

输入两个if else语句?

[英]Entering both if AND else statement?

所以我有这个代码(为解决方案更新)。

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ...
        final Direction d = directions.get(position);
        if (d != null) {

            TextView direction = (TextView) row.getTag(R.id.directionTextView);
            TextView departure1 = (TextView) row.getTag(R.id.departure1);
            TextView departure2 = (TextView) row.getTag(R.id.departure2);
            TextView departure3 = (TextView) row.getTag(R.id.departure3);

            direction.setText(d.getName());

            if (d.getTimeStamps().size() == 0) {
                departure1.setText(R.string.nodepartures);
                departure1.setTextColor(R.color.grey);
            } else {
                for (int i = 0; i < d.getTimeStamps().size(); i++) {
                    switch (i) {
                    case 0:
                        departure1.setText(d.getTimeStamps().get(i));
                        break;
                    case 1:
                        departure2.setText(d.getTimeStamps().get(i));
                        break;
                    case 2:
                        departure3.setText(d.getTimeStamps().get(i));
                        break;
                    default:
                        break;
                    }
                }
            }
        }
        return row;
    }
}

我遇到的问题是,当一个TextViews不应该变成灰色时会变灰。 我试着通过将文本再次设置为黑色来修复它,但是这会使每一个都变成灰色。 直到我尝试:

setTextColor(context.getResources().getColor(R.color.black));

而不仅仅是

setTextColor(R.color.black);

不知道为什么后者在设置文本灰色时有效,但确实如此。 我想我只是有点迟钝。 :)

您认为发生的事情根本不可能发生( *** )。 你需要做的是向自己证明它没有发生。

我是通过在代码中添加一些跟踪图来实现的。 将一个放在if语句之前,一个放在“then”和“else”子句的开头,一个放在if语句之后。 然后运行它。 我希望这将揭示if语句实际上是运行两次,并且第一次运行“then”子句而第二次运行“else”子句。

(*理论上,如果模拟器中存在严重错误,可能会发生这种情况。但是如果你有无可辩驳的证据,你应该只考虑这种情况。)

(**另一种可能性是上面的示例代码和您正在测试的实际代码之间可能存在显着差异。它发生......)

AsLanFromNarnia走在正确的轨道上。 ListView回收其子视图。 您永远不能假设convertView处于其类型的任何类型的默认状态。 每次调用getView设置每个相关字段。 在您的情况下,它意味着在设置文本时设置文本颜色。

还有另一种处理此类情况的方法,您希望拥有异构列表:使用视图类型。 您的适配器可以返回getViewTypeCount的类型数,然后从getItemViewType报告每个项的类型。 如果你这样做,你将始终将convertView传递给正确类型的getView方法,从而减少每次更改静态布局的需要。

嗯......我看不出那会怎么样。 你确定你的支架在正确的位置吗? 如果你改变声明,它仍然会发生吗?

我同意Aircule! 这段代码非常糟糕! 这个怎么样?

if(d.getTimeStamps().isEmpty())
{
   departure1.setText(R.string.nodepartures);
   departure1.setTextColor(R.color.grey);
} 
else
{
   departure1.setText(d.getTimeStamps().get(0));
   departure2.setText(d.getTimeStamps().get(1));
   departure3.setText(d.getTimeStamps().get(2));
}

它应该做同样的事情,它不那么复杂。 另外,假设您运行此代码一次并且列表为空,因此您将departure1的颜色设置为灰色并再次运行它。 这次你得到数据并填写项目,但你永远不会改变departure1的颜色,所以它会保持灰色。 同样,如果您采用相反的方式,则在列表为空时不会清空TextViews 另一个提示,如果只有三个项目(或任何小的固定数量的项目),那么你可能最好只使用普通的布局而不是列表。 这样您就不必通过制作自定义适配器,只需按名称调用项目即可。

根据您的描述,我们只能提供最好的提示。

  • 您确定要重新编译所有代码吗? 我看到调试产生有趣的结果,因为部分代码与字节码beng调试不同步
  • 这是一个基于事件的系统吗? 可能是你的代码被调用了两次,一次是空的列表,然后直接跟在列表中,并且在该条目被添加到列表之后有1个条目?

作为代码改进,我将执行以下操作来重构switch (假设这里的控件类型是Text ,这可能是错误的但很容易修复):

if (d.getTimeStamps().isEmpty()) {
   departure1.setText(R.string.nodepartures);
   departure1.setTextColor(R.color.grey);
} else {
    Text[] fields = new Text[] { departure1, departure2, departure3 };

    for (int i = 0; i < fields.length && i < d.getTimeStamps().size(); i++) {
        fields[i].setText(d.getTimeStamps().get(i));
        fields[i].setTextColor(R.color.black);
    }
}

更新

看到您没有为出发值设置颜色,我认为您假设在此代码运行时新创建了这些行。 如果该假设不正确,您的情况可能是先前保持“无离开”线的线现在被重新用于离线,因此继承了灰色。

您是否在LayoutInflator加载的布局XML文件中设置了默认颜色或样式?

我相信它变灰了,因为在你的程序中的某个点上,该方法被调用0个时间戳。

它只需要发生一次设置departure1.textColor属性,然后它将持续直到更改回来。

你提到过你曾尝试在else语句中将其设置为黑色,但它将所有内容都变为灰色。 这根本没有意义。 尝试添加命令以在每个case语句处将文本转换为黑色,因此:

case 0:
departure1.setTextColor(R.color.black);
departure1.setText(d.getTimeStamps().get(i));
break;
case 1:
departure2.setTextColor(R.color.black);
departure2.setText(d.getTimeStamps().get(i));
break;
case 2:
departure3.setTextColor(R.color.black);
departure3.setText(d.getTimeStamps().get(i));
break;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM