Why can not I see a JSON query using the Volley library (Web Services)?

0

I'm trying to create a web service using the Volley library, only when I run my app on a physical device I do not see the data that is hosted on a free server.

The data is already in JSON but it does not remain unseen, already searched on the internet and I can not find any solution.

FragmentEvents.java

public class FragmentEventos extends Fragment {

private static final String URL_EVENTS ="http://mece.260mb.net/models/eventos_json.php?i=1"; /*URL de los datos JSON*/
List<Eventos> eventosList = new ArrayList<>(); /*Lista para almacenar todos los eventos*/
RecyclerView recyclerView;





public FragmentEventos() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    final View view = inflater.inflate(R.layout.fragment_eventos, container, false);
    recyclerView = view.findViewById(R.id.rcv); /*Obtenemos la vista del RecyclerView desde XML*/
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

    eventosList = new ArrayList<>(); /*Inicializar la lista de los Eventos*/

    //adapter = new EventosAdapter(getActivity(),eventosList);
    loadEvents(); /*Este método busca y analizas JSON para mostrarlo en el RecyclerView*/
    return view;
}
private void loadEvents(){     
    StringRequest stringRequest = new StringRequest(Request.Method.GET, URL_EVENTS,
            new Response.Listener<String>(){

                @Override
                public void onResponse(String response) {
                    try{
                        JSONArray array = new JSONArray(response); /*Convertir la cadena en objeto JSON de tipo array*/

                        for (int i=0; i<array.length(); i++){ /*Atravesar el objeto*/

                            JSONObject event = array.getJSONObject(i); /*Obtener el objeto del Evento de JSON Array*/

                            eventosList.add(new Eventos( /*Agregando el evento  a la lista de Eventos*/
                                    event.getInt("id"),
                                    event.getString("tema"),
                                    event.getString("ponente"),
                                    event.getString("hora"),
                                    event.getString("fecha"),
                                    event.getString("lugar")
                            ));
                        }
                        EventosAdapter adapter = new EventosAdapter(getActivity(),eventosList); /*Crea el objeto adaptador y configura para el RecyclerView*/
                        recyclerView.setAdapter(adapter);
                        adapter.notifyDataSetChanged();

                    }catch (JSONException e){
                        e.printStackTrace();
                    }
                }
            },
    new Response.ErrorListener(){

        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(getActivity(),error.getMessage(),Toast.LENGTH_LONG).show();
        }
    });
    Volley.newRequestQueue(getActivity()).add(stringRequest); /*Agregar el stringRequest a la cola*/
}

}

EventAdapter.java

public class EventosAdapter extends RecyclerView.Adapter<EventosAdapter.EventoViewHolder> {
private Context context;
private List<Eventos> eventoList;



public EventosAdapter(Context context, List<Eventos> eventoList) {
    this.context = context;
    this.eventoList = eventoList;

}

@Override
public EventoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater inflater = LayoutInflater.from(context);
    View view = inflater.inflate(R.layout.list_layout,null);
    return new EventoViewHolder(view);
}

@Override
public void onBindViewHolder(EventoViewHolder holder, int position) {
    Eventos eventos = eventoList.get(position);

    holder.tema.setText(eventos.getTema());
    holder.ponente.setText(eventos.getPonente());
    holder.lugar.setText(eventos.getLugar());
    holder.hora.setText(eventos.getHora());
    holder.fecha.setText(eventos.getFecha());
}

@Override
public int getItemCount() {
    return eventoList.size();
}

class EventoViewHolder extends RecyclerView.ViewHolder{
    TextView tema, ponente, lugar, fecha, hora;


    public EventoViewHolder(View itemView) {
        super(itemView);
        tema = (TextView) itemView.findViewById(R.id.tema);
        ponente = itemView.findViewById(R.id.ponente);
        lugar = itemView.findViewById(R.id.Lugar);
        fecha = itemView.findViewById(R.id.fecha);
        hora = itemView.findViewById(R.id.hora);
    }
}

}

POJO.java

public class Eventos {
private int id;
private String tema;
private String ponente;
private String lugar;
private String hora;
private String fecha;



public Eventos(int id, String tema, String ponente, String lugar, String hora, String fecha) {
    this.id = id;
    this.tema = tema;
    this.ponente = ponente;
    this.lugar = lugar;
    this.hora = hora;
    this.fecha = fecha;
}

public int getId() {
    return id;
}

public String getTema() {
    return tema;
}

public String getPonente() {
    return ponente;
}

public String getLugar() {
    return lugar;
}

public String getHora() {
    return hora;
}

public String getFecha() {
    return fecha;
}

}

    
asked by 05.12.2017 в 23:17
source

2 answers

0

You are converting the response to JSONArray but the answer given by the url that samples is a object, that is, a JSONObject .

Change this:

 @Override
public void onResponse(String response) {
    try{
        // response es un JSONObject, no un array
        JSONArray array = new JSONArray(response);

By:

@Override
public void onResponse(String response) {
    try{
        // response es un JSONObject, no un array
        JSONObject data = new JSONObject(response);

        // obtienes el id del evento
        int eventId = data.getInt("id");
        //...

Now, because of your code you notice that you wait for a list of events so you will have to make sure to return an array instead of an object so that it works for you without making any changes to your code.

    
answered by 05.12.2017 в 23:27
0

You must analyze the answer:

{
id: "5",
tema: "Alsjsj",
ponente: "jjkajk",
hora: "1 am",
fecha: "2017-02-25",
lugar: "nnjj",
descripcion: "jnjknkj"
}

There is something important to consider,

The answer .Json can be of two types:

  

- If the .json starts with { it is considered as a Json object.

     

- If the .json starts with [ it is considered as a Json fix.

Therefore what you get is a JSONObject:

  //JSONArray array = new JSONArray(response); 
  JSONObject event  = new JSONObject(response);

Make this change to your loadEvents() method code:

 private void loadEvents(){     
    StringRequest stringRequest = new StringRequest(Request.Method.GET, URL_EVENTS,
            new Response.Listener<String>(){

                @Override
                public void onResponse(String response) {
                    try{
                        //JSONArray array = new JSONArray(response); /*Convertir la cadena en objeto JSON de tipo array*/

                        //for (int i=0; i<array.length(); i++){ /*Atravesar el objeto*/

                            JSONObject event =  new JSONObject(response);//array.getJSONObject(i); /*Obtener el objeto del Evento de JSON Array*/

                            eventosList.add(new Eventos( /*Agregando el evento  a la lista de Eventos*/
                                    event.getInt("id"),
                                    event.getString("tema"),
                                    event.getString("ponente"),
                                    event.getString("hora"),
                                    event.getString("fecha"),
                                    event.getString("lugar")
                            ));
                        //}
                        EventosAdapter adapter = new EventosAdapter(getActivity(),eventosList); /*Crea el objeto adaptador y configura para el RecyclerView*/
                        recyclerView.setAdapter(adapter);
                        adapter.notifyDataSetChanged();

                    }catch (JSONException e){
                        e.printStackTrace();
                    }
                }
            },
    new Response.ErrorListener(){

        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(getActivity(),error.getMessage(),Toast.LENGTH_LONG).show();
        }
    });
    Volley.newRequestQueue(getActivity()).add(stringRequest); /*Agregar el stringRequest a la cola*/
}
    
answered by 05.12.2017 в 23:43