entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

ArrayList No me carga los datos

El caso es que estoy haciendo una consulta a un servidor vía post, la cual funciona bien puedo hacer dicha consulta y me muestra los resultado si y solo si cambio la linea cargaListado(obtDatosJSON(res)); la cambio por un toast al pasar la variable a un ArrayList no me carga los datos y tampoco me da un error.

final Button button1=(Button)findViewById(R.id.button1);
    button1.setOnClickListener(new OnClickListener(){

    public void onClick(View view) {
        Thread nt = new Thread() {
            @Override
            public void run() {

                EditText cedula = (EditText) findViewById(R.id.editconsul);
                try {
                    final String res;

                        res = enviarPost(cedula.getText().toString());

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        cargaListado(obtDatosJSON(res));
                    }
                });
                }catch (Exception e) {
            // TODO: handle exception

        };
            }
        };
        nt.start();
    }
    });
    }

public void cargaListado(ArrayList<String> res){
    ArrayAdapter<String> adaptador =
    new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, res);
    ListView listado = (ListView) findViewById(R.id.listarcon);
    listado.setAdapter(adaptador);
}

public ArrayList<String> obtDatosJSON(String ent){
    ArrayList<String> listado= new ArrayList<String>();
    try {
        JSONArray json= new JSONArray(ent);
        String texto="";
        for (int i=0; i<json.length();i++){
            texto = json.getJSONObject(i).getString("cedula") +" - "+
                    json.getJSONObject(i).getString("nombre") +" - "+
                    json.getJSONObject(i).getString("apellido") +" - "+
                    json.getJSONObject(i).getString("direccion");
            listado.add(texto);
        }
    } catch (Exception e) {
        // TODO: handle exception
        Toast toast2 =
                Toast.makeText(getApplicationContext(), "No tiene caso creado", Toast.LENGTH_SHORT);

            toast2.setGravity(Gravity.CENTER|Gravity.CENTER,0,0);

            toast2.show();

    }
    return listado;
}

1voto

GusGarsaky comentado

¿Estás seguro que te la lista que recibe cargaListado no está vacía? Hazle un isEmpty() para saber si está vacía o no.

0voto

wroque comentado

fijate aqui

String res = enviarPost(cedula.getText().toString());
Log.e("resultado", res);

luego me fijaria en la función obtDatosJSON, yo preferí usar la libreria GSON para parsear objetos JSON.

0voto

Luis Moreno comentado

Buenos días hice lo que me recomendaste al colocar esta lineas:

String res = enviarPost(cedula.getText().toString());
Log.e("resultado", res);

muestra los datos en el LogCat el cargarLista esta vacio ¿como le paso los datos para que me llene la lista?

0voto

Luis Moreno comentado

to es lo que me aparece en el LogCat:
07-08 12:03:14.987: E/resultado(17188): <tr><td>Cedula: "" Nombre: "" Apellido: "" Dirección: "" Correo: "" Caso: "0" Estatus: ""</td><tr><tr><td>Cedula: "" Nombre: "" Apellido: "" Dirección: "" Correo: "" Caso: "0" Estatus: ""</td><tr><tr><td>Cedula: "" Nombre: "Luis" Apellido: "Moreno" Dirección: "" Correo: "[email protected]" Caso: "9999" Estatus: "Sin pantalla"</td><tr><html>
07-08 12:03:14.987: E/resultado(17188): <head>
07-08 12:03:14.987: E/resultado(17188): <meta charset="utf-8">
07-08 12:03:14.987: E/resultado(17188): <title>Formulario de consulta</title>
07-08 12:03:14.987: E/resultado(17188): <link href="estilos.css" rel="stylesheet" type="text/css">
07-08 12:03:14.987: E/resultado(17188): </head>
07-08 12:03:14.987: E/resultado(17188): <body>
07-08 12:03:14.987: E/resultado(17188): <br>
07-08 12:03:14.987: E/resultado(17188): <br>
07-08 12:03:14.987: E/resultado(17188): <center><input class="form-btn" onclick= location.href='consulta.html' name="submit" type="button" value="Consultar" >
07-08 12:03:14.987: E/resultado(17188): </center>
07-08 12:03:14.987: E/resultado(17188): </body>
07-08 12:03:14.987: E/resultado(17188): </html>

Por favor me podrian indicar como hago para que me muestre ese resultado en una lista

0voto

wroque comentado

si esta vacio, es obvio que no llenara la vista, fijate en la función enviarPost, es posible que haga un post y no obtenga resultado. hace un get, para obtener el JSON.

0voto

wroque comentado

no te esta respondiendo un JSON, sino un HTML, debes verificar la API REST que devuelva una estructura json.

el servicio esta mal, empezando por ahi falla todo el algoritmo.

0voto

Peter comentado

Luis, he cambiado todas tus respuestas a comentario. Por favor publica como comentario tus comentarios.

Las respuestas son para dar una respuesta a la pregunta y ofrecer una solución.

Saludos.

0voto

wroque comentado

que molestia ese luis, mira que hacerle trabajo extra a otros.

0voto

Peter comentado

No es molestia :D

0voto

Luis Moreno comentado

No respondas y listo, no se que hace gente como esta en un foro

0voto

wroque comentado

que enojon, solo bromeaba.

0voto

Luis Moreno comentado

Sigo sin resolver y debo entregar eso el viernes en la universidad alguien tendrá donde la consulta via post me rellena una lista

0voto

wroque comentado

que mal. bueno te aconsejo crear un archivo.json y dejar ahi el contenido de los objetos que necesitas visualizar. Luego simplemente lees el contenido del archivo dentro de tu proyecto y realizas las pruebas.

0voto

Luis Moreno comentado

Hice un nuevo archivo php json y me da el mismo error. aqui les dejo el codigo a ver si alguien ve el error. Gracias por su ayuda.

public class MainActivity extends Activity {

private ListView listado;
private String nombre; String apellido; String direccion;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final Button button1=(Button) findViewById(R.id.button1);
    button1.setOnClickListener(new OnClickListener(){

    public void onClick(View view) {

        listado = (ListView) findViewById(R.id.listarcon);
        Thread nt = new Thread() {
            @Override

            public void run() {

                EditText cedula = (EditText) findViewById(R.id.editconsul);
                try {
                    final String res;

                        final String res1 = enviarPost(cedula.getText().toString());
                        Log.e("resultado", res1);

                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        cargaListado(obtDatosJSON(res1));
                    }
                });
                }catch (Exception e) {
            // TODO: handle exception

        };
            }
        };
        nt.start();
    }
    });
    }

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public String enviarPost(String cedula) {

    HttpClient httpClient = new DefaultHttpClient();
    HttpContext localContext = new BasicHttpContext();
    HttpPost httpPost = new HttpPost(
            "http://www.lmorenoprueba.esy.es/consulta.php");
    HttpResponse response = null;
    try {

        List<NameValuePair> params = new ArrayList<NameValuePair>(3);
        params.add(new BasicNameValuePair("cedula", cedula));
        params.add(new BasicNameValuePair("nombre", nombre));
        params.add(new BasicNameValuePair("apellido", apellido));
        params.add(new BasicNameValuePair("direccion", direccion));
        httpPost.setEntity(new UrlEncodedFormEntity(params));
        HttpResponse resp = httpClient.execute(httpPost);
         HttpEntity ent = resp.getEntity();
         cedula = EntityUtils.toString(ent, "UTF-8");

    } catch (Exception e) {
        // TODO: handle exception
        Toast toast2 =
                Toast.makeText(getApplicationContext(), "No tiene conexión a Internet", Toast.LENGTH_SHORT);

            toast2.setGravity(Gravity.CENTER|Gravity.CENTER,0,0);

            toast2.show();
    }
    return cedula;

}

public void cargaListado(ArrayList<String> ent){
    ArrayAdapter<String> adaptador =
    new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, ent);
    ListView listado = (ListView) findViewById(R.id.listarcon);
    listado.setAdapter(adaptador);
}

public ArrayList<String> obtDatosJSON(String ent){
    ArrayList<String> listado= new ArrayList<String>();
    try {
        JSONArray json= new JSONArray(ent);
        String texto="";
        for (int i=0; i<json.length();i++){
            texto = json.getJSONObject(i).getString("cedula") +" - "+
                    json.getJSONObject(i).getString("nombre") +" - "+
                    json.getJSONObject(i).getString("apellido") +" - "+
                    json.getJSONObject(i).getString("direccion");
            listado.add(texto);
        }
    } catch (Exception e) {
        // TODO: handle exception
        Toast toast2 =
                Toast.makeText(getApplicationContext(), "No tiene caso creado", Toast.LENGTH_SHORT);

            toast2.setGravity(Gravity.CENTER|Gravity.CENTER,0,0);

            toast2.show();

    }
    return listado;
}

1voto

Lukard comentado

Te está sucediendo exactamente lo mismo en el método enviarPost(...). Pero lo que está mal aquí es el concepto.

Los widgets (en tu caso el Toast) hay que tratarlos en el thread de pantalla. Y las llamadas a Internet en un thread en background, ya que estas operaciones pueden ser (y en general lo son) largas.

Mi recomendación es que solo invoques el método runOnUiThread(...) cuando utilices widgets (como el Toast o el EditText) dentro del Thread nt que has creado.

De hecho podrias crear un método del estilo

private void muestraToast(final String textoQueMostrar) {
  runOnUiThread(new Runnable() {
    Toast toast = Toast.makeText(MainActivity.this, textoQueMostrar, Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.CENTER,0,0);
    toast.show();
  });
}

Y con esto ya puedes llamar siempre a este método y olvidarte de problemas con el thread de pantalla.

1 Respuesta

1voto

binamonk Puntos3790

Creo que traes problemas con los contextos, por que no intentas quitar el tryCatch del método obtDatosJson y mejor lo implementas en

 runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                        cargaListado(obtDatosJSON(res));
                        } catch {
                           // ... Mostrar Toast ...
                        }
                    }
                });

obviamente tendrias que sacar el metodo del try catch que usas para atrapar errores del metodo enviarPost asi tendrias dos handlers, uno para la comunicacion de red y otro para el parseo.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta