AdapterView.OnItemSelectedListener 正在返回 NULL 视图
AdapterView.OnItemSelectedListener is returning NULL view
我有以下代码:
public class OnboardingActivity extends BaseLoggedInActivity
implements CountryPickerDialog.ICountryPickerDialogUsers, AdapterView.OnItemSelectedListener {
private Spinner _countryCodeSpinner;
.
.
.
private void setupCountrySpinner() {
List<String> sortedCountryCodeList = CountryData.getInstance().getSortedCountryCodes();
ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
R.layout.country_code_spinner_item,
sortedCountryCodeList);
_countryCodeSpinner.setOnItemSelectedListener(this);
_countryCodeSpinner.setAdapter(adapter);
_countryCodeSpinner
.setOnTouchListener(getCountryCodeSpinnerTouchListener(_countryCodeSpinner));
int position = getDefaultCountryNamePosition();
if (position >= 0) {
_countryCodeSpinner.setSelection(position);
}
}
.
.
.
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
_logger.debug("Inside onItemSelected");
view.setSelected(true);
}
我在上述函数 onItemSelected 中遇到空指针异常。它返回 NULL 视图。我从其中一位用户那里收到的这条痕迹,但我自己无法重现。使用 NULL 视图调用 onItemSelected 的原因可能是什么?
谢谢
可能是配置更改后导致的,例如旋转设备。您的微调器已重新创建,并且您在 onItemSelected 回调中收到一个空参数。
您可以在您的实现中将视图注释为@nullable 然后
if (view != null) {view.setSelected(true);}
如果您使用的是 Kotlin,试试这个:
override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long){
view?.isSelected = true
}
很晚才回答我仍然不知道它是怎么发生的,但你需要在
中更改view :View
@Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { _logger.debug("Inside onItemSelected"); view.setSelected(true); }
whit view:View?
当视图不可用时它可以为 null
您可以通过旋转阻止默认选择可能的空视图,然后显式执行setSelection()
:
int position = getDefaultCountryNamePosition();
if (position < 0) {
position = 0;
}
// Block default selection to custom onItemSelected() from listener initialization
//, see
// + 1 as fake value because onItemSelected() only triggered by setSelection() if different value.
_countryCodeSpinner.setSelection(position + 1, false);
_countryCodeSpinner.setOnItemSelectedListener(this);
// position(without + 1) is our real target.
// set selection explicitly should not null now
_countryCodeSpinner.setSelection(position, false);
请注意,如果您在 onItemSelected() 中更改 UI,仅捕获 null 会导致问题,因为布局已经刷新。
我有以下代码:
public class OnboardingActivity extends BaseLoggedInActivity
implements CountryPickerDialog.ICountryPickerDialogUsers, AdapterView.OnItemSelectedListener {
private Spinner _countryCodeSpinner;
.
.
.
private void setupCountrySpinner() {
List<String> sortedCountryCodeList = CountryData.getInstance().getSortedCountryCodes();
ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
R.layout.country_code_spinner_item,
sortedCountryCodeList);
_countryCodeSpinner.setOnItemSelectedListener(this);
_countryCodeSpinner.setAdapter(adapter);
_countryCodeSpinner
.setOnTouchListener(getCountryCodeSpinnerTouchListener(_countryCodeSpinner));
int position = getDefaultCountryNamePosition();
if (position >= 0) {
_countryCodeSpinner.setSelection(position);
}
}
.
.
.
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
_logger.debug("Inside onItemSelected");
view.setSelected(true);
}
我在上述函数 onItemSelected 中遇到空指针异常。它返回 NULL 视图。我从其中一位用户那里收到的这条痕迹,但我自己无法重现。使用 NULL 视图调用 onItemSelected 的原因可能是什么?
谢谢
可能是配置更改后导致的,例如旋转设备。您的微调器已重新创建,并且您在 onItemSelected 回调中收到一个空参数。
您可以在您的实现中将视图注释为@nullable 然后
if (view != null) {view.setSelected(true);}
如果您使用的是 Kotlin,试试这个:
override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long){
view?.isSelected = true
}
很晚才回答我仍然不知道它是怎么发生的,但你需要在
中更改view :View
@Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { _logger.debug("Inside onItemSelected"); view.setSelected(true); }
whit view:View?
当视图不可用时它可以为 null
您可以通过旋转阻止默认选择可能的空视图,然后显式执行setSelection()
:
int position = getDefaultCountryNamePosition();
if (position < 0) {
position = 0;
}
// Block default selection to custom onItemSelected() from listener initialization
//, see
// + 1 as fake value because onItemSelected() only triggered by setSelection() if different value.
_countryCodeSpinner.setSelection(position + 1, false);
_countryCodeSpinner.setOnItemSelectedListener(this);
// position(without + 1) is our real target.
// set selection explicitly should not null now
_countryCodeSpinner.setSelection(position, false);
请注意,如果您在 onItemSelected() 中更改 UI,仅捕获 null 会导致问题,因为布局已经刷新。