AdapterView.OnItemSelectedListener返回了空视图

8

我有以下代码:

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视图。这个错误信息是从用户那里接收到的,但我自己无法重现它。有什么可能导致onItemSelected被调用时带有NULL视图?

谢谢。


3
由于 _countryCodeSpinner.setSelection(position); 这行代码,列表弹出窗口没有显示,因此没有视图存在...请提供该设备上的Android版本?(可能在API 11之前,spinner列表弹出窗口更像是对话框) - Selvin
1
安卓系统版本为4.0.4 - rohit sharma
1
我在从后退栈中获取片段时遇到了同样的问题。我会继续努力解决它。 - Mahdi
1
在API24(Android7)中出现了相同的问题。 - ErfanDP
4个回答

4

可能是由于配置更改导致的,例如旋转设备。您的下拉列表重新创建并且在onItemSelected回调中收到了一个空参数。

您可以在实现中给视图加上@nullable注释,然后

if (view != null) {view.setSelected(true);}

如果您正在使用Kotlin,请尝试以下方法:

override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long){
    view?.isSelected = true
}

3

回答很晚,我仍然不知道它是怎么发生的,但你需要在代码中更改view: View


@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    _logger.debug("Inside onItemSelected");
    view.setSelected(true);
}

使用 view:View? 当视图不可用时,它可以为 null


0

您可以通过旋转来阻止可能为空的默认选择视图,然后显式地执行setSelection()

int position = getDefaultCountryNamePosition();
if (position < 0) {
    position = 0;
}
// Block default selection to custom onItemSelected() from listener initialization
//, see https://dev59.com/p2Yr5IYBdhLWcg3wxNC8#37561529
// + 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); 

请注意,仅仅捕获null可能会导致问题,如果您在onItemSelected()内部更改UI,因为布局已经刷新。

0
尝试在视图创建后延迟一段时间调用spinner.setAdapter(adapter);

解决方案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接