动态设置微调器的选择,不触发 OnItemSelectedListener

Dynamically setSelection of spinner, do not trigger OnItemSelectedListener

我有一个 activity,它有许多级联微调器,在第一个 select 之后,第二个微调器初始化并填充数据,在第二个 select 项之后,第三个微调器初始化并填充数据等等。

对于每个微调器,我都是这样创建的,它是迭代的:

public ArrayList<MaterialSpinner> spinnerlist = new ArrayList<>();

public void createView(){
 final MaterialSpinner spinner = new MaterialSpinner(context);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener(){//...after select item next spinner creates with calling createView() iteratively}
        loadSpinnerData(); // set adapter and more
        spinnerlist.add(spinner);
}   

当 select 由用户使用时一切正常,但是当我动态使用 setSelection(positionOfItem) 时,不幸的是

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()

不来电。我不知道为什么会这样。

   for (int i = 0; i < some_value; i++) {

            int positionOfItem = get_proper_position;
            spinnerList.get(i).setSelection(positionOfItem); //this not trigger onItemSelect!
        }

问题就在这里。第一次微调器大小为 1,但在设置 selection 之后,侦听器不调用并且第二个微调器不创建。

我还认为这是因为操作很耗时,所以尝试使用 运行-able 和 post 一些延迟,但它没有用。

我认为您想要实现的目标可以通过 performItemClick

实现
for (int i = 0; i < some_value; i++) {

        int positionOfItem = get_proper_position;
        MaterialSpinner spinner = spinnerList.get(i);
        spinner.setSelection(positionOfItem);

        View itemView = (View)spinner.getChildAt(positionOfItem);
        long itemId = your_spinner.getAdapter().getItemId(positionOfItem);

        spinner.performItemClick(itemView, positionOfItem, itemId);
} 

setSelection 不会触发 OnItemSelectedListenerperformItemClick 会触发。

我终于找到了一个令人毛骨悚然的解决方案。看来问题是 android 系统需要一些时间来创建项目和视图。 当我调用第一个微调器的 onClickListener 时,它应该创建第二个微调器并填充数据,这是一项耗时的操作。所以我不得不以可变间隔为每个项目延迟:

for (int i = 0; i < some_value; i++) {
            selectItemOfSpinner(i);
        }


private void selectItemOfSpinner(final int i) {

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            MaterialSpinner spinner = spinnerList.get(i);
            int positionOfItem = get_proper_position;
            spinner.setSelection(positionOfItem, true);
        }
    }, 50*i);

}

这解决了我的问题,所有微调器都正确创建和填充。但在一些慢速设备中,延迟时间应该增加,这就是为什么我说令人毛骨悚然的方式。我正在研究这个,如果我找到更好的方法,我会更新解决方案。