How to prevent onItemSelected from being called when using setSelection?

1

I have ListView and within each item it loads a Spinner with some information.

The way I want it to work (Expectation): The first time you load Activity , display the user a list and within each item of it, have a Spinner with the options for him to choose. Once the user chooses, the request is made to the WebService informing the values.

The form that is working (Reality): The problem is that when Activity loads, an item of Spinner is selected and thus requests the WebService. If the user will see more items in the list, he will automatically make requests, because Spinner items are selected.

MenuAdapter.java

public class MenuAdapter extends BaseAdapter {


    public MenuAdapter(List<Atendimento> atendimentos, Activity activity, String posicaoAtualDoUsuario, boolean carregaSpinner) {
        this.atendimentos = atendimentos;
        this.activity = activity;
        this.posicaoAtualDoUsuario = posicaoAtualDoUsuario;
        this.carregaSpinner = carregaSpinner;
    }


    @Override
    public int getCount() {
        return atendimentos.size();
    }

    @Override
    public Object getItem(int position) {
        return atendimentos.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final LayoutInflater inflater = activity.getLayoutInflater();
        final View linha = inflater.inflate(R.layout.item_atendimento, null);

        final Atendimento atendimentos1 = atendimentos.get(position);
        iniciadorComponente(linha);
        iniciadorDados(atendimentos1, linha);


        if (atendimentos1.getSituacaoOS().equals("Na fila")) {
            spnSituacaoItem.setSelection(0);
        } else if (atendimentos1.getSituacaoOS().equals("A caminho")) {
            spnSituacaoItem.setSelection(1);
        } else if (atendimentos1.getSituacaoOS().equals("Em execução")) {
            spnSituacaoItem.setSelection(2);
        } else if (atendimentos1.getSituacaoOS().equals("Pausado")) {
            spnSituacaoItem.setSelection(3);
        } else if (atendimentos1.getSituacaoOS().equals("Concluído")) {
            spnSituacaoItem.setSelection(4);
        } else if (atendimentos1.getSituacaoOS().equals("Abortado")) {
            spnSituacaoItem.setSelection(5);
        }

        // Verificação tempo
        if (atendimentos1.getDuracao().equals("")) {
            imgTempoItem.setVisibility(View.GONE);
            txtTempoItem.setVisibility(View.GONE);
        }

        // Verificação agendamento
        if (atendimentos1.getAgendamento().equals("")) {
            imgAgendamentoItem.setVisibility(View.GONE);
            txtAgendamentoItem.setVisibility(View.GONE);
        }

        // Verificação sla restante
        if (atendimentos1.getSlaFormatado().equals("")) {
            imgSlaItem.setVisibility(View.GONE);
            txtSlaItem.setVisibility(View.GONE);
            txtSlaRestanteItem.setVisibility(View.GONE);
            progressSlaRestante.setVisibility(View.GONE);
        }

        // Verificação progress bar
        if (progressSlaRestante.getProgress() <= 25) {
            progressSlaRestante.setProgressDrawable(linha.getResources().getDrawable(R.drawable.progress_bar_state_green));
        } else if (progressSlaRestante.getProgress() > 25 && progressSlaRestante.getProgress() <= 50) {
            progressSlaRestante.setProgressDrawable(linha.getResources().getDrawable(R.drawable.progress_bar_state_yellow));
        } else if (progressSlaRestante.getProgress() > 50 && progressSlaRestante.getProgress() <= 75) {
            progressSlaRestante.setProgressDrawable(linha.getResources().getDrawable(R.drawable.progress_bar_state_orange));
        } else if (progressSlaRestante.getProgress() > 75) {
            progressSlaRestante.setProgressDrawable(linha.getResources().getDrawable(R.drawable.progress_bar_state_red));
        }


        spnSituacaoItem.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                if (carregaSpinner) {
                 if (position == 0) {
                     progressDialog = ProgressDialog.show(
                             linha.getContext(),
                             linha.getResources().getString(R.string.aguarde),
                             linha.getResources().getString(R.string.enviandoDados),
                             false,
                             true
                     );
                     progressDialog.setCanceledOnTouchOutside(false);
                     progressDialog.setCancelable(false);


                     new Thread(new Runnable() {
                         @Override
                         public void run() {
                             try {
                                 Thread.sleep(1000);

                                 handler.post(new Runnable() {
                                     @Override
                                     public void run() {
                                         Autenticacao autenticacao = new Autenticacao(chaveIntegracaoClasse.criarChaveIntegracao(linha.getResources().getString(R.string.cnpjTeste)));
//                                        DadosAtendimento dadosAtendimento = new DadosAtendimento(preferences.getString("nome", null));

                                         DadosOS dadosOS = new DadosOS(atendimentos1.getNumero(), usuario, situacaoAnterior, "A", dataFormatada);

                                         AlteraSituacaoOs alteraSituacaoOs = new AlteraSituacaoOs(autenticacao, dadosOS);
                                         EnvelopeSituacaoOs envelopeSituacaoOs = new EnvelopeSituacaoOs(alteraSituacaoOs);

                                         //chama o retrofit para fazer a requisição no webservice
                                         EnviarSituacaoOsCallback enviarSituacaoOsCallback = new EnviarSituacaoOsCallback(
                                                 linha.getContext(),
                                                 progressDialog,
                                                 urlBase);
                                         enviarSituacaoOsCallback.enviarDadosOs(envelopeSituacaoOs);
                                     }
                                 });
                             } catch (Exception e) {
                                 e.printStackTrace();
                             } finally {
                                 progressDialog.dismiss();
                             }
                         }
                     }).start();
                     carregaSpinner = false;
                 } else if (position == 1) {
                    progressDialog = ProgressDialog.show(
                            linha.getContext(),
                            linha.getResources().getString(R.string.aguarde),
                            linha.getResources().getString(R.string.enviandoDados),
                            false,
                            true
                    );
                    progressDialog.setCanceledOnTouchOutside(false);
                    progressDialog.setCancelable(false);


                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                Thread.sleep(1000);

                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        Autenticacao autenticacao = new Autenticacao(chaveIntegracaoClasse.criarChaveIntegracao(linha.getResources().getString(R.string.cnpjTeste)));
//                                        DadosAtendimento dadosAtendimento = new DadosAtendimento(preferences.getString("nome", null));

                                        DadosOS dadosOS = new DadosOS(atendimentos1.getNumero(), usuario, situacaoAnterior, "A", dataFormatada);

                                        AlteraSituacaoOs alteraSituacaoOs = new AlteraSituacaoOs(autenticacao, dadosOS);
                                        EnvelopeSituacaoOs envelopeSituacaoOs = new EnvelopeSituacaoOs(alteraSituacaoOs);

                                        //chama o retrofit para fazer a requisição no webservice
                                        EnviarSituacaoOsCallback enviarSituacaoOsCallback = new EnviarSituacaoOsCallback(
                                                linha.getContext(),
                                                progressDialog,
                                                urlBase);
                                        enviarSituacaoOsCallback.enviarDadosOs(envelopeSituacaoOs);
                                    }
                                });
                            } catch (Exception e) {
                                e.printStackTrace();
                            } finally {
                                progressDialog.dismiss();
                            }
                        }
                    }).start();
                } else if (position == 2) {
                    progressDialog = ProgressDialog.show(
                            linha.getContext(),
                            linha.getResources().getString(R.string.aguarde),
                            linha.getResources().getString(R.string.enviandoDados),
                            false,
                            true
                    );
                    progressDialog.setCanceledOnTouchOutside(false);
                    progressDialog.setCancelable(false);


                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                Thread.sleep(1000);

                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        Autenticacao autenticacao = new Autenticacao(chaveIntegracaoClasse.criarChaveIntegracao(linha.getResources().getString(R.string.cnpjTeste)));
//                                        DadosAtendimento dadosAtendimento = new DadosAtendimento(preferences.getString("nome", null));

                                        DadosOS dadosOS = new DadosOS(atendimentos1.getNumero(), usuario, situacaoAnterior, "E", dataFormatada);

                                        AlteraSituacaoOs alteraSituacaoOs = new AlteraSituacaoOs(autenticacao, dadosOS);
                                        EnvelopeSituacaoOs envelopeSituacaoOs = new EnvelopeSituacaoOs(alteraSituacaoOs);

                                        //chama o retrofit para fazer a requisição no webservice
                                        EnviarSituacaoOsCallback enviarSituacaoOsCallback = new EnviarSituacaoOsCallback(
                                                linha.getContext(),
                                                progressDialog,
                                                urlBase);
                                        enviarSituacaoOsCallback.enviarDadosOs(envelopeSituacaoOs);
                                    }
                                });
                            } catch (Exception e) {
                                e.printStackTrace();
                            } finally {
                                progressDialog.dismiss();
                            }
                        }
                    }).start();
                } else if (position == 3) {
                    progressDialog = ProgressDialog.show(
                            linha.getContext(),
                            linha.getResources().getString(R.string.aguarde),
                            linha.getResources().getString(R.string.enviandoDados),
                            false,
                            true
                    );
                    progressDialog.setCanceledOnTouchOutside(false);
                    progressDialog.setCancelable(false);


                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                Thread.sleep(1000);

                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        Autenticacao autenticacao = new Autenticacao(chaveIntegracaoClasse.criarChaveIntegracao(linha.getResources().getString(R.string.cnpjTeste)));
//                                        DadosAtendimento dadosAtendimento = new DadosAtendimento(preferences.getString("nome", null));

                                        DadosOS dadosOS = new DadosOS(atendimentos1.getNumero(), usuario, situacaoAnterior, "P", dataFormatada);

                                        AlteraSituacaoOs alteraSituacaoOs = new AlteraSituacaoOs(autenticacao, dadosOS);
                                        EnvelopeSituacaoOs envelopeSituacaoOs = new EnvelopeSituacaoOs(alteraSituacaoOs);

                                        //chama o retrofit para fazer a requisição no webservice
                                        EnviarSituacaoOsCallback enviarSituacaoOsCallback = new EnviarSituacaoOsCallback(
                                                linha.getContext(),
                                                progressDialog,
                                                urlBase);
                                        enviarSituacaoOsCallback.enviarDadosOs(envelopeSituacaoOs);
                                    }
                                });
                            } catch (Exception e) {
                                e.printStackTrace();
                            } finally {
                                progressDialog.dismiss();
                            }
                        }
                    }).start();

                } else if (position == 4) {
                    progressDialog = ProgressDialog.show(
                            linha.getContext(),
                            linha.getResources().getString(R.string.aguarde),
                            linha.getResources().getString(R.string.enviandoDados),
                            false,
                            true
                    );
                    progressDialog.setCanceledOnTouchOutside(false);
                    progressDialog.setCancelable(false);


                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                Thread.sleep(1000);

                                handler.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        Autenticacao autenticacao = new Autenticacao(chaveIntegracaoClasse.criarChaveIntegracao(linha.getResources().getString(R.string.cnpjTeste)));
//                                        DadosAtendimento dadosAtendimento = new DadosAtendimento(preferences.getString("nome", null));

                                        DadosOS dadosOS = new DadosOS(atendimentos1.getNumero(), usuario, situacaoAnterior, "C", dataFormatada);

                                        AlteraSituacaoOs alteraSituacaoOs = new AlteraSituacaoOs(autenticacao, dadosOS);
                                        EnvelopeSituacaoOs envelopeSituacaoOs = new EnvelopeSituacaoOs(alteraSituacaoOs);

                                        //chama o retrofit para fazer a requisição no webservice
                                        EnviarSituacaoOsCallback enviarSituacaoOsCallback = new EnviarSituacaoOsCallback(
                                                linha.getContext(),
                                                progressDialog,
                                                urlBase);
                                        enviarSituacaoOsCallback.enviarDadosOs(envelopeSituacaoOs);
                                    }
                                });
                            } catch (Exception e) {
                                e.printStackTrace();
                            } finally {
                                progressDialog.dismiss();
                            }
                        }
                    }).start();

                }
                } else {
                    if (spnSituacaoItem.isInEditMode()){
                        carregaSpinner = true;
                    }
                }
            }

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

            }
        });


        linha.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent itDetalheAtendimento = new Intent(v.getContext(), DetalheAtendimentoActivity.class);
                itDetalheAtendimento.putExtra("atendimento", atendimentos1);
                itDetalheAtendimento.putExtra("posicaoAtualUsuario", posicaoAtualDoUsuario);
                v.getContext().startActivity(itDetalheAtendimento);
            }
        });

        return linha;
    }

    private void iniciadorComponente(View linha) {
        txtPrioridadeItem = (TextView) linha.findViewById(R.id.txtPrioridadeItem);
        txtNomeItem = (TextView) linha.findViewById(R.id.txtNomeItem);
        txtSituacaoClienteItem = (TextView) linha.findViewById(R.id.txtSituacaoClienteItem);
        txtProtocoloItem = (TextView) linha.findViewById(R.id.txtProtocoloItem);
        imgEnderecoItem = (ImageView) linha.findViewById(R.id.imgEnderecoItem);
        txtEnderecoItem = (TextView) linha.findViewById(R.id.txtEnderecoItem);
        imgTopicoItem = (ImageView) linha.findViewById(R.id.imgTopicoItem);
        txtTopicoItem = (TextView) linha.findViewById(R.id.txtTopicoItem);
        imgTempoItem = (ImageView) linha.findViewById(R.id.imgTempoItem);
        txtTempoItem = (TextView) linha.findViewById(R.id.txtTempoItem);
        imgAgendamentoItem = (ImageView) linha.findViewById(R.id.imgAgendamentoItem);
        txtAgendamentoItem = (TextView) linha.findViewById(R.id.txtAgendamentoItem);
        imgSlaItem = (ImageView) linha.findViewById(R.id.imgSlaItem);
        txtSlaItem = (TextView) linha.findViewById(R.id.txtSlaItem);
        txtSlaRestanteItem = (TextView) linha.findViewById(R.id.txtSlaRestanteItem);
        progressSlaRestante = (ProgressBar) linha.findViewById(R.id.progressSlaRestante);
        spnSituacaoItem = (Spinner) linha.findViewById(R.id.spnSituacaoItem);
    }

    private void iniciadorDados(Atendimento atendimentos1, View linha){
        SharedPreferences preferences = linha.getContext().getSharedPreferences("USER_INFORMATION", linha.getContext().MODE_PRIVATE);
        long prioridade = atendimentos1.getOrdemPrioridade();
        long protocolo = atendimentos1.getProtocolo();
        String em = "em ";
        String hrs = " hrs";

        urlBase = preferences.getString("urlBase", null);
        usuario = preferences.getString("usuario", null);
        dataFormatada = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(new Date());

        txtPrioridadeItem.setText(String.valueOf(prioridade));
        txtNomeItem.setText(atendimentos1.getCliente());
        txtSituacaoClienteItem.setText(atendimentos1.getSituacaoCliente());
        txtProtocoloItem.setText(String.valueOf(protocolo));
        txtEnderecoItem.setText(atendimentos1.getEndereco());
        txtTopicoItem.setText(atendimentos1.getTopico());
        txtTempoItem.setText(em + atendimentos1.getDuracao() + hrs);
        txtAgendamentoItem.setText(atendimentos1.getAgendamento());
        txtSlaRestanteItem.setText(atendimentos1. getSlaFormatado());
        progressSlaRestante.setMax(100);
        progressSlaRestante.setProgress(60);
        progressSlaRestante.setProgressDrawable(linha.getResources().getDrawable(R.drawable.progress_bar_states));
        SpinnerAdapter spinnerAdapter = new SpinnerAdapter(linha.getContext(),icImagem, situacoes);
        spnSituacaoItem.setAdapter(spinnerAdapter);
    }
}
    
asked by anonymous 19.07.2017 / 15:48

1 answer

1

Expected is that this does not happen, since the spnSituacaoItem.setSelection() is before the assignment ( setOnItemSelectedListener() ) of the OnItemSelectedListener.

The reason why it happens has to do with how setSelection() is implemented.

Item selection is done using a SelectionNotifier of type Runnable. It is put on the stack using the View.post() method. That is, the call to the onItemSelected method of the OnItemSelectedListener is not done immediately after calling setSelection() , but asynchronously. So the OnItemSelectedListener is assigned to the Spinner before the setSelection() is processed.

One way to resolve this is to also put the OnItemSelectedListener assignment in the stack:

//Se houver algum listener atribuído anula-o
spinner.setOnItemSelectedListener(null);

spinner.setSelection(pos);

//Coloca a atribuição do OnItemSelectedListener na pilha
spinner.post(new Runnable() {
    @Override
    public void run() {
        setSpinnerListener();
    }
});

In your code you should do this:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ....
    ....
    } else if (progressSlaRestante.getProgress() > 75) {
        progressSlaRestante.setProgressDrawable(linha.getResources().getDrawable(R.drawable.progress_bar_state_red));
    }

    //Se houver algum listener atribuído anula-o 
    spnSituacaoItemsetOnItemSelectedListener(null);
    //Coloca a atribuição do OnItemSelectedListener na pilha
    spnSituacaoItem.post(new Runnable() {
        @Override
        public void run() {

                //Coloque aqui todo o código do spnSituacaoItem.setOnItemSelectedListener

                spnSituacaoItem.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                    @Override
                    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                        if (carregaSpinner) {
                            ....
                            ....
                    @Override
                    public void onNothingSelected(AdapterView<?> parent) {

                    }
            });
        }
    });
    ....
    ....
    return linha;
}

Note: Your code is in great confusion. You should simplify it by extracting some parts for methods or classes.

    
19.07.2017 / 16:03