Dynamically setSelection of spinner, do not trigger OnItemSelectedListener

╄→尐↘猪︶ㄣ 提交于 2019-12-22 07:59:34

问题


I have a activity that have many cascaded spinner and after select first one, second spinner initialize and fill data and after select item from second, third spinner initialize and fill data and so on.

for each spinner I create them like this and it is iterative:

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

every things go right when select is by user, but when I use setSelection(positionOfItem) Dynamically, unfortunately

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()

do not calls. I do not know why this happens.

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

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

the problem is here. spinner size is 1 in first time, but after setselection , listener do not calls and second spinner do not creates.

I also thought this is because of time consuming action so try to use a run-able and post some delay but it not worked.


回答1:


I finally find a creepy solution. it seems the problem is with android system that need some time to create item and views. when I call onClickListener of first spinner it should create second one and fill data and it is time consuming action. so I had to put delay for each Item with variable intervals:

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

}

this solved my problem and all spinners creates and fills properly. but in some slow device the delay time should increase and this is why i said creepy way. I working on this and I will update the solution if I find a better way.




回答2:


I think what you're trying to accomplish is achievable with 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 doesn't fire OnItemSelectedListener but performItemClick does.



来源:https://stackoverflow.com/questions/40067757/dynamically-setselection-of-spinner-do-not-trigger-onitemselectedlistener

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!