我有一个 Activity ,其中有许多层叠的微调器,在选择第一个微调器后,第二个微调器初始化并填充数据,然后从第二个,第三个微调器中选择项初始化并填充数据,依此类推。

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

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);
}

用户选择时一切正常,但是不幸的是,当我动态使用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,但是在setselection之后,监听器不会调用,第二个旋转器也不会创建。

我还认为这是由于耗时的操作,因此请尝试使用可运行的程序并发布一些延迟,但此方法不起作用。

最佳答案

我终于找到了一个令人毛骨悚然的解决方案。看来问题出在Android系统上,需要一些时间来创建项目和 View 。
当我调用第一个微调器的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);

}

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

10-08 18:33