Problems sending data from a ListView to another Activity

1

QuestionAdapter

public class QuestionAdapter extends BaseAdapter implements OnClickListener {

private List<Pergunta> lista;
private Context context;

public PerguntaAdapter(Context context, List<Pergunta> lista){
    this.context = context;
    this.lista = lista;
}

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

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

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

static class ViewHolder{
     TextView tvPergunta;
     Button btnSim, btnNao, btnEnviarRespostas;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder viewHolder = null;
    try{
        Pergunta pergunta = lista.get(position);

        if(convertView == null){
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.modelo_questionario, null);

            viewHolder = new ViewHolder();

            viewHolder.btnSim.setOnClickListener(this);
            viewHolder.btnNao.setOnClickListener(this);

            viewHolder.tvPergunta = (TextView) convertView.findViewById(R.id.textPerguntas);
            viewHolder.btnSim = (Button) convertView.findViewById(R.id.btnSim);
            viewHolder.btnNao = (Button) convertView.findViewById(R.id.btnNao);

        }
        else{
            viewHolder = (ViewHolder) convertView.getTag();
        }
        //convertView.setTag(viewHolder);
        viewHolder.btnSim.setTag(R.layout.modelo_questionario, position);
        viewHolder.btnNao.setTag(R.layout.modelo_questionario, position);

        viewHolder.tvPergunta.setText(pergunta.getPergunta());



    }catch(Exception erro){
        Log.e("Erro", "Erro: "+erro.getStackTrace());
    }

    return convertView;
}

public void onClick(View v) {
    // Com essa posicao eh possivel saber qual pergunta ele respondeu

    int position = (Integer) v.getTag(R.layout.modelo_questionario);

    Pergunta pergunta = lista.get(position);

    // Comparo o ID da View que foi clicada com o ID do botao SIM,
    // gerando um booleano

    boolean resposta = v.getId() == R.id.btnSim;

    // Criar um campo na pergunta para armazenar a resposta
    // Ou usar um ArrayList ou SparseArray para armezar.

    pergunta.setResposta(resposta);
}

public List<Pergunta> getPerguntas() {
    return lista;
}

Quiz activity

public class Activity_Questionario extends Activity {

Funcoes funcoes = new Funcoes();
String[] perguntas;
String[] id;
int posicao = 0;
int posicao2 = 0;
Activity_Login l;
public String resposta2;
public String idQues;

public void onCreate(Bundle bundle){
    super.onCreate(bundle);
    setContentView(R.layout.layout_questionario);

    l = new Activity_Login();



    //-------------------------------------------------------------------------------

    Log.i("Logar", "Entrou no evento");
    String url = "http://"+l.ip+"/projetotcc/android/questionario.php";

    String respostaRetornada = null;

    Log.i("Logar", "Vai entrar no try");

    try{
        respostaRetornada = ConexaoHttpClient.executaHttpGet(url);
        String resposta = respostaRetornada.toString();
        resposta = resposta.replaceAll("\s+", "");
        Log.i("Perguntas", "Perguntas: "+resposta);


        char separador = '#';
        int contaPerguntas = 0;

        for (int i=0; i < resposta.length(); i++){
            if (separador == resposta.charAt(i)){
                contaPerguntas++;
                perguntas = new String[contaPerguntas];
            }
        }

        char caracterLido = resposta.charAt(0);
        String pergunta = "";

        for (int i=0; caracterLido != '^'; i++){
            caracterLido = resposta.charAt(i);
            Log.i("Chars", "Chars das perguntas"+caracterLido);

            if (caracterLido != '#'){

                //pergunta+= (char) caracterLido;
                if (caracterLido == '*'){
                    pergunta = pergunta + " ";
                }else
                    pergunta = pergunta + caracterLido;
            }else{
                Log.i("Nome", "Nome: "+pergunta);
                perguntas[posicao] =""+ pergunta;
                Log.i("Nome posição ["+posicao+"]", ""+perguntas[posicao]);
                posicao = posicao + 1;
                pergunta = "";
            }
        }
        Log.i("Fim", "Fim do for");

    }catch(Exception erro){
        Toast.makeText(getBaseContext(), "Erro: "+erro, Toast.LENGTH_LONG).show();
        Log.e("Erro", "Erro: "+erro.getStackTrace());
    }

    ListView lv = (ListView) findViewById(R.id.lvPre);

    List<Pergunta> perguntasList = new ArrayList<Pergunta>();
    Pergunta p = new Pergunta();

    for (final String k : perguntas) {
        p = new Pergunta();
        p.setPergunta(k);
        perguntasList.add(p);
    }
    lv.setAdapter(new PerguntaAdapter(this, perguntasList));

    PerguntaAdapter adapter = (PerguntaAdapter) lv.getAdapter();
    List<Pergunta> ListaPergunta = adapter.getPerguntas();

    ArrayList<Boolean> respostas = new ArrayList<Boolean>(ListaPergunta.size());

    for(Pergunta pergunta : ListaPergunta) {
        respostas.add(pergunta.getResposta());
    }

    Intent i = new Intent(this, Activity_Conf_Inicio_Ques.class);

    i.putExtra("RESPOSTAS", respostas);

    startActivity(i);

    //-------------------------------------------------------------------------------


            String url3 = "http://"+l.ip+"/projetotcc/android/parametroQuestionario.php";
            ArrayList<NameValuePair> parametrosPost3 = new ArrayList<NameValuePair>();
            parametrosPost3.add(new BasicNameValuePair("pq", Pq));

            String respostaRetornada3 = null;

            Log.i("Logar", "Vai entrar no try");

            try{
                respostaRetornada3 = ConexaoHttpClient.executaHttpPost(url3, parametrosPost3);
                idQues = respostaRetornada3.toString();
                idQues = idQues.replaceAll(" ", "*");
                idQues = idQues.replaceAll("\s+", "");
                Log.i("Pacientes", "Id do questionario: "+idQues);

            }catch(Exception erro){
                Toast.makeText(getBaseContext(), "Erro: "+erro, Toast.LENGTH_LONG).show();
            }



    //-------------------------------------------------------------------------------


    PerguntaAdapter pr = new PerguntaAdapter(this, perguntasList);

    String urlInserirPacRes = "http://"+l.ip+"/projetotcc/android/inserirPacRes.php";
    ArrayList<NameValuePair> parametrosPost2 = new ArrayList<NameValuePair>();
    parametrosPost2.add(new BasicNameValuePair("id", resposta2));


}

}

Confirmation of the questionnaires

public class Activity_Conf_Inicio_Ques extends Activity {

Button btnConfirma, btnCancela;
EditText editConfirm;
AutoCompleteTextView acPacientes2;
String[] pacientes;
String[] pacientes2;
int posicao = 0;
int posicao2 = 0;
public static int senhaDigitada2;
Activity_Login l;

public void onCreate(Bundle bundle){
    super.onCreate(bundle);
    setContentView(R.layout.layout_conf_inicio_ques);

    l = new Activity_Login();

    ArrayList<Boolean> respostas = (ArrayList<Boolean>) getIntent().getSerializableExtra("RESPOSTAS");

    Log.i("Logar", "Entrou no evento");
    String url = "http://"+l.ip+"/projetotcc/android/listarPacientes.php";

    String respostaRetornada = null;

    Log.i("Logar", "Vai entrar no try");

    try{
        respostaRetornada = ConexaoHttpClient.executaHttpGet(url);
        String resposta = respostaRetornada.toString();
        resposta = resposta.replaceAll("\s+", "");
        Log.i("Pacientes", "Pacientes: "+resposta);         

        //-------------------------------------------------------------------------------

        char separador  = '#';
        int contaPacientes = 0;

        for (int i=0; i < resposta.length(); i++){
            if (separador == resposta.charAt(i)){
                contaPacientes++;
                pacientes  = new String[contaPacientes];
            }
        }

        char caracterLido = resposta.charAt(0);
        String nome  = "";

        for (int i=0; caracterLido != '^'; i++){
            caracterLido = resposta.charAt(i);
            Log.i("Chars", "Chars do paciente"+caracterLido);

            if (caracterLido != '#'){
                nome+= (char) caracterLido;
            }else{
                Log.i("Nome", "Nome: "+nome);
                pacientes[posicao] =""+ nome;
                Log.i("Nome posição ["+posicao+"]", ""+pacientes[posicao]);
                posicao = posicao + 1;
                nome = "";
            }
        }

    }catch(Exception erro){
        Toast.makeText(getBaseContext(), "Erro: "+erro, Toast.LENGTH_LONG).show();
    }

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, layout.simple_dropdown_item_1line, pacientes);
    acPacientes2 = (AutoCompleteTextView) findViewById(R.id.acPacientes2);
    acPacientes2.setAdapter(adapter);


    //-------------------------------------------------------------------------------

    final Intent intent2 = new Intent(getBaseContext(), Activity_Questionario.class);
    final Intent intent = getIntent();
    final int Senha = intent.getIntExtra("senha", 0);
    Toast.makeText(getBaseContext(), "Senha: "+Senha, Toast.LENGTH_SHORT).show();

    editConfirm = (EditText) findViewById(R.id.editSenhaConfirm);

    btnConfirma = (Button) findViewById(R.id.btnConfirmarQues);
    btnConfirma.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View arg0) {
            String senhaDigitada = editConfirm.getText().toString();
            if (!(senhaDigitada.length() == 0)){
                senhaDigitada2 = Integer.parseInt(senhaDigitada);
                Log.v("???", "Valor = " + senhaDigitada2);

                if (senhaDigitada2 == Senha){
                    intent2.putExtra("paciente", acPacientes2.getText().toString());
                    startActivity(intent2);
                }
                else
                    Toast.makeText(getBaseContext(), "Senha incorreta", Toast.LENGTH_SHORT).show();

            }   
        }
    });

    btnCancela = (Button) findViewById(R.id.btnCancelarQues);
    btnCancela.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            cancelaQues();

        }
    });
}

public void cancelaQues(){
    finish();
}
    
asked by anonymous 16.09.2014 / 22:32

1 answer

1

There's still plenty to do in this Adapter . I'll try to outline the solution.

The points I will address:

  • In Adapter you need to query OnClickListener for responses.

  • Send Activity with replies as Adapter to other ArrayList .
  • Adapter

    // O próprio Adapter é o ClickListener das views, pode mudar isso, mas fiz dessa forma por simplicidade e reducao do numero de objetos criados.
    public Adapter extends BaseAdapter implements View.OnClickListener {
    
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
    
            // Codigo que popula a view
    
            viewHolder.btnSim.setOnClickListener(this);
            viewHolder.btnNao.setOnClickListener(this);
    
            // Guardo na View, a posicao da lista ao qual ela se refere.
            // Sera usado depois para saber qual pergunta ele respondeu
            // A tag precisa ser um valor autogerado e unico para nao ter conflito.
            viewHolder.btnSim.setTag(R.layout.modelo_questionario, position);
            viewHolder.btnNao.setTag(R.layout.modelo_questionario, position);
        }
    
        @Override
        public void onClick(View v) {
            // Com essa posicao eh possivel saber qual pergunta ele respondeu
            int position = (Integer) v.getTag(R.layout.modelo_questionario);
    
            Pergunta pergunta = lista.get(position);
    
            // Comparo o ID da View que foi clicada com o ID do botao SIM,
            // gerando um booleano
            boolean resposta = v.getId() == R.id.btnSim;
    
            // Criar um campo na pergunta para armazenar a resposta
            // Ou usar um ArrayList ou SparseArray para armezar.
            pergunta.setResposta(resposta);
        }
    }
    

    In your Activity

    // Considerando que o Adapter ja tem as respostas armazenas nas perguntas
    List<Pergunta> perguntas = adapter.getPerguntas();
    
    ArrayList<Boolean> respostas = new ArrayList<Boolean>(perguntas.size());
    
    for(Pergunta pergunta : perguntas) {
        respostas.add(pergunta.getResposta());
    }
    
    Intent i = new Intent(this, NovaActivity.class);
    
    i.putExtra("RESPOSTAS", respostas);
    
    startActivity(i);
    

    Na Intent Extra

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Restante do codigo...
    
        ArrayList<Boolean> respostas = getIntent().getSerializableExtra("RESPOSTAS");
    
        // Usar o array
    }
    

    Of course you can pass all the questions, but there you will have to see in my answer in this question how to do this. Either through the interface Activity or NovaActivity .

    Edit:

    To get the list of Serializable you must first get the instance of Parcelable and then get the list through it.

    PerguntaAdapter adapter = (PerguntaAdapter) lv.getAdapter();
    
    // Criar o metodo getPerguntas para retornar a lista
    List<Pergunta> perguntas = adapter.getPerguntas();
    
        
    17.09.2014 / 19:51