android – 动态setSplection的选择器,不要触发OnItemSelectedListener

我有一个具有许多级联微调器的活动,在选择第一个后,第二个微调器初始化和填充数据,然后从第二个,第三个微调器初始化和填充数据后选择项目,等等.

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

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!
        }

问题出在这里. spinner大小首次为1,但在setselection之后,侦听器不会调用,第二个微调器不会创建.

我还认为这是因为耗时的操作,所以尝试使用可运行的并发布一些延迟,但它没有奏效.

解决方法:

我终于找到一个令人毛骨悚然的解似乎问题是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);

}

解决了我的问题,并且所有纺纱厂都能正确地创造和填充.但在一些缓慢的设备中延迟时间应该增加,这就是为什么我说令人毛骨悚然的方式.我正在研究这个问题,如果找到更好的方法,我会更新解决方案.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...