onOtemSelected()在setOnItemSelectedListener()之前调用

时间:2015-02-04 14:54:47

标签: android

我在调用setSelection之前在Spinner上调用setOnItemSelectedListener,为什么onItemSelected方法会被触发?

public class MyActivity implements AdapterView.OnItemSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.options, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        Spinner spinner = (Spinner) findViewById(R.id.MySpinner);
        spinner.setAdapter(adapter);
        // spinner.setOnItemSelectedListener(null); // tried this also
        spinner.setSelection(1);
        spinner.setOnItemSelectedListener(this);
    }

    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        Log.d(DEBUG_TAG, "onItemSelected() firing");
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {}
}

1 个答案:

答案 0 :(得分:0)

可能setOnItemSelectedListener只是将OnItemSelectedListener(立即)引用,而setSelection与&#34;相关&#34; View(有一个州state_selected)因此在布局完成绘图时会调用它 - 您的选择将被&#34;发布&#34;。 setSelectionspinner.post(spinner.setSelectionImmediatelly(position))

一样运作
  1. 设置选择,View忙于自己的绘图,因此选择将在View完成自己的方法后显示
  2. 设置对Listener
  3. 的引用
  4. 过了一会儿(非常短)View将自己绘制(在onCreate之后)并检查它是否应该重绘自己的绘图 - 新选择正在等待所以它将被绘制然后检查是否有任何Listener。是的,它设置在onCreate
  5. 如果你想&#34;修复&#34;这可以在Listener方法中设置onResume或使用您的微调器的ViewTreeObserver