5
respostas

Salvar escolha RadioButtom depois da seleção

Olá professor tudo bem? Poderia me ajudar nessa questão, estou quebrando a cabeça e não consigo achar uma solução, fiz alguns dos seus cursos para me aprimorar e até utilizei algumas da suas técnicas no meu projeto, esse que estou com problemas, bom eu tenho uma lista com perguntas nelas exitem 2 RadiosButtom para repostas, o que eu quero é quando o usuário clicar no botão salve, ele liste os radios selecionados e salve em uma lista, do jeito que consegui fazer ele pega os Radios na hora do click do usuário dentro do Adapter(creio que está errado) gerando assim um problema, se o usuário clicar em outro radio da mesma posição da lista ele está guardando os dois radios gerando duplicidade. Eu subi o projeto no GitHub mas no modo privado, pois uso o Firebase para gerar a lista, e uso a URL para baixar a lista e não queria que ficasse exposto. Me desculpe pela liberdade mas adicionei seu usuário do GItHub no projeto para ficar melhor o entendimento meu problema está no ExpandableRecyclerAdapter e na Activity que manipula esse adapter que é a ReportActivity, se tiver algum tempo para me ajudar ficaria muito feliz, senão mesmo assim agradeço pois já me ajudou com os seus cursos. Abraços!

5 respostas

Oi Renderson, tudo bem?

Eu consegui rodar o projeto e não entendi como simulo o problema que foi mencionado, consegue mandar um print do App para eu entender o que acontece visualmente?

Olhando apenas o código fica difícil de identificar facilmente o que o adapter faz, ele está com muito trecho que poderia ser refatorado. Sendo assim, a minha sugestão inicial é refatorar o código extraindo para funções, tenho certeza que esse primeiro passo vai até te ajudar a entender se tem algo a mais que está fazendo que não está fazendo sentido ou que precisa ser feito de outra maneira ou até mesmo se precisa de uma nova implementação.

[]s

Olá professor, obrigado pelo retorno, vamos lá... realmente preciso refatora não só o adapter como outras classes obrigado pela dica.

Bom essa tela vem depois que o usuário entra no app e digita as informações nome, e-mail e data para criar um relatório. Essa tela me da a opção de escolher entre dois radiosButtom

Screenshot_20190726-111524

Nesse outro print da mesma seção o que eu fiz foi alterar minha decisão e escolher a outra opção o "Não", e depois vou clicar em salvar, até ai tudo certo sem erros

Screenshot_20190726-111610

Veja que é salvo o relatório e me mostra concluído em outra lista de finalizados

Screenshot_20190726-111627

Agora quando clico no item da lista de concluídos ele me me abre o PDF que foi gerado ao salvar o relatório, e é ai o problema aparece, veja que existe duas resposta para o mesmo item que selecionei, o que quer dizer que ele pegou os dois clickes que eu dei no radiobuttom gerando duas resposta para a mesma questão

Screenshot_20190726-111641

Esse trecho que captura o clique no radioButtom está no Adapter ExpandableRecyclerViewAdapter, pelo que pesquise e como implementei ele está guardando as informações na hora do clique usando setOnCheckedChangeListener, assim os radios selecionados estão sendo colocados na lista listTxtRadio que será chamada para ser salva no banco de dados

//Test onClick RadioButton
                ((ItemVh) viewHolder).mRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(RadioGroup group, int checkedId) {

                        int selectedRadioButtonID = ((ItemVh) viewHolder).mRadioGroup.getCheckedRadioButtonId();

                        //Test Salve in a ArrayList RadioButton Selected
                        radioButton = group.findViewById(selectedRadioButtonID);

                        String selectedText = (String) viewHolder.tvTitleList.getText();
                        String selectedRadioButtonText = radioButton.getText().toString();
                        int selectedRadioId = radioButton.getId();

                        listIDRadio.add(selectedRadioId);
                        listId.add(position);
                        listText.add(selectedText);
                        listTxtRadio.add(selectedRadioButtonText);

E aqui está o método que pega todas as lista preenchidas juntas elas em um JsonArray para ser salva, que ao clicar no button SALVE ele salva no SQLite,, essa parte de código está na classe ReportActivity método handleSave()

// Save Company, Email, Data, List
    private void handleSave() {
        //testRadio();

        final ReportItems reportItems = new ReportItems();
        reportItems.setCompany(resultCompany.getText().toString());
        reportItems.setEmail(resultEmail.getText().toString());
        reportItems.setDate(resultDate.getText().toString());
//        ArrayList<String> listText = new ArrayList<>();
//        reportItems.setCheckList(listText);

        // Convert ArrayList in Json Object
        for (int i = 0; (i < mAdapter.listTxtRadio.size()) && (i < mAdapter.listText.size()) && (i < mAdapter.listIDRadio.size()) && (i < mAdapter.listId.size()); i++) {
            JSONObject jsObject = new JSONObject();
            try {
                //jsObject.put("List", job);
                jsObject.put("title_list", mAdapter.listText.get(i));
                jsObject.put("radio_tx", mAdapter.listTxtRadio.get(i));
                jsObject.put("radio_id", mAdapter.listIDRadio.get(i));
                jsObject.put("id_list", mAdapter.listId.get(i));
                Log.i("log", "Item: " + jsObject + " jsObject");

            } catch (JSONException e) {
                e.printStackTrace();
            }
            jsArray.put(jsObject);
        }

        reportItems.setListJson(jsArray.toString());
        Log.i("log", "Item: " + jsArray + " jsArray");
        // Finish JsonObject

        //Save
        if (this.mReportBusiness.insert(reportItems)) {
            // Execute Async create PDF
            PDFAsyncTask asy = new PDFAsyncTask(this);
            asy.execute(reportItems);
            Toast.makeText(this, R.string.txt_report_save, Toast.LENGTH_SHORT).show();
            finish();
        } else {
            Toast.makeText(this, R.string.txt_error_save, Toast.LENGTH_SHORT).show();
            finish();
        }
    }

O problema nesse caso é ter duas respostas para o mesmo item? Se sim, a princípio você pode adicionar na lista apenas quando você clicar em salvar, pois se vc fizer cada vez que tiver mudança no radiobutton vai existir essa possibilidade de manter ambas opções.

Uma outra abordagem é evitar o uso de lista e apenas manter a opção em um objeto singular.

[]s

Isso mesmo professor, o problema é ter duas respostas para o mesmo item, é nessa parte de passar essa função de adicionar na lista só depois que apertar no botão salvar que não consegui, uns teste que tentei sempre me retorna null o objeto radioGroup, da erro e fecha o app. Essa abordagem objeto singular estou usando para salvar o estado do radio para que a recyclcerView ao rolar a lista não desmarque a opção já escolhida.

Esse do NPE não deveria acontecer, você consegue refatorar o código, implementar apenas pegando quando for salvar e me mostrar?

Dessa forma eu posso verificar o motivo de dar NPE.No caso do objeto singular, você pode criar uma classe que agrega tanto as opções marcadas, como qualquer outra informação em atributos, dessa forma, você trabalha com esse objeto que vai armazenar apenas o que precisa em cada item.

[]s