我有一个从 ArrayAdapter 获取数据的微调器。数组对象有一个 toString() 方法,它由微调器使用。
在这种情况下,我在数组中只有一项时设置适配器。数组中的对象返回一个非空字符串,但虽然微调器中有一项,但它是空的。为什么微调器中没有有效的 TextView 作为项目。这是在设置适配器后立即设置断点的程序:
这是问题所在:
这是 MolData 类
final class MolData
{
private String name;
private String value;
final static Pattern endsDot = Pattern.compile("[.]$");
MolData(String name, String value)
{
this.name = name;
this.value = value;
}
MolData(String fileLine)
{
int dividerPos = fileLine.indexOf(':');
value = fileLine.substring(0, dividerPos);
name = fileLine.substring(dividerPos + 1);
}
@Override
public String toString()
{
return name;
}
String getValue()
{
return value;
}
void setValue(String value)
{
this.value = value;
}
boolean hasName(String name)
{
return name.equals(this.name);
}
@SuppressLint("DefaultLocale")
boolean isAfterName(String name)
{
if (this.value.equals(""))
{
return true;
}
int cmp = name.toLowerCase().compareTo(this.name.toLowerCase());
if (cmp == 0)
{
cmp = name.compareTo(this.name);
}
return cmp > 0;
}
boolean hasValue(String value)
{
return this.value.equals(endsDot.matcher(value).replaceFirst(""));
}
}
Abd 这是有问题的代码:
void finaliseSpinner(Spinner memSpinner, View molValue)
{
this.memSpinner = memSpinner;
this.molValue = (TextView) molValue;
if (! restart)
{
memSpinner.setVisibility((molData.isEmpty() || (molData.size() == 1 && molData.get(0).hasValue(""))) ? View.INVISIBLE : View.VISIBLE);
spinerColour1st = true;
}
memSpinner.setAdapter(spinnerAdapter =
new ArrayAdapter<MolData>(activity, android.R.layout.simple_spinner_dropdown_item, molData));
ignoreItemSelected = true;
memSpinner.setOnItemSelectedListener(new SpinListener());
}
进一步澄清:我遇到的问题是 getChildAt(0) 在 OnItemSelected 侦听器中返回 null 。但是,在正常启动时调用此代码时,虽然在设置适配器后 getChildCount 显示为零,但当随后立即设置侦听器时,由其添加引起的侦听器调用具有有效的 getChildAt(0) !但是,当由于屏幕已旋转而调用此代码时,getChildAt(0) 在侦听器因已添加而触发时为空。在正常启动时,从用户与 UI 的交互中调用此代码,但在重新启动屏幕后,从 onResume() 调用此代码(在片段中)。[它是从 onCreate 调用的,但我在生命周期的后期移动了它以查看它是否有帮助,但没有成功。]