Problem to send json between Activitys with retorfit

0

I have the following problem I am trying to bring a list of objects that I get from a json , from an activity through a controller. Within the code that I am attaching, what I am looking for is to pass the list of specialties to my MainActivity through a method.

MainActivity

public class MainActivity extends AppCompatActivity implements MainActivityView {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Controlador ctr = new Controlador(this);
        ctr.getAll();
    }
    @Override
    public void mostrarEspecialidades(ArrayList<Especialidad> especialidades) {

        ArrayList<Especialidad> esp = especialidades;
    }
    @Override
    public void errorCargarEspecialidades(String error) {

    }
}

Controller

    public class Controlador {

    ArrayList<Especialidad> lista ;

    private MainActivityView mView;
    public Controlador(MainActivityView view) {
        mView = view;
    }

    public void getAll(){
        Api c = new Api(mView);
        c.cargarEspecialidades();
    }

    public void setDatos(ArrayList<Especialidad> datos){
        lista = datos;
    }

}

Api

   public class Api implements Callback<ArrayList<Especialidad>> {

    public static final String base_url = "http://192.168.1.55:8080/";

    private MainActivityView mView;
    public Api(MainActivityView view){
        mView = view;
    }

    public void cargarEspecialidades() {
        Gson gson = new GsonBuilder().setLenient().create();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(base_url)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
        EspecialidadService servicio = retrofit.create(EspecialidadService.class);
        Call<ArrayList<Especialidad>> call = servicio.getEspecialidad();
        call.enqueue(this);
    }

    @Override
    public void onResponse(Response<ArrayList<Especialidad>> response, Retrofit retrofit) {
        if(response.isSuccess()){
            Controlador c = new Controlador(null);
            ArrayList<Especialidad> a = response.body();
            c.setDatos(a);
            mView.mostrarEspecialidades(a);
    }else {
            mView.errorCargarEspecialidades(String.valueOf(response.errorBody()));
            System.out.println(response.errorBody());}
    }
    @Override
    public void onFailure(Throwable t) {

    }
}

MainActivityView

public interface MainActivityView {

    void mostrarEspecialidades(ArrayList<Especialidad> especialidades);
    void errorCargarEspecialidades(String error);
}
    
asked by Germanccho 01.02.2018 в 17:35
source

1 answer

1

It's more or less the same as I mentioned in your previous question link

You have to create an interface with the methods that your view has, that reference, store it to your controller and finally, send it in your API and use that reference when you already have the result of your retrofit request, but not before converting the answer to an arrangement or something more manageable.

interface MainActivityView{
    void mostrarEspecialidades(ArrayList<Especialidad> especialidades);
    void errorCargarEspecialidades(String error);   
}

public class MainActivity extends AppCompatActivity implements MainActivityView{
    ......
    ......
    Controlador ctr = new Controlador(this);
    ctr.getAll(); //getAll no regresa nada


public class Controlador{
    private MainActivityView mView;
    public Controlador(MainActivityView view){
       mView=view;
    }

    public void /*ArrayList<Especialidad>*/ getAll(){
        Api c = new Api(mView);
        c.cargarEspecialidades();
        //listita = lista;
        //return listita;
    }

.........

public class Api implements Callback<ArrayList<Especialidad>> {
    private MainActivityView mView;
    public Api(MainActivityView view){
        mView = view;
    }

    @Override
    public void onResponse(Response<ArrayList<Especialidad>> response, Retrofit retrofit) {
    if(response.isSuccess()){
        ArrayList<Especialidad> especialidades = miFuncionMagica(response.body)
        mView.mostrarEspecialidades(especialidades);
        //t = response.body();
        //Controlador ctr = new Controlador();
        //ctr.setLista(t);
    }else{
        /*Esto que voy a poner es extra pero te puede ser util*/
        mView.errorCargarEspecialidades(response.errorBody());
        System.out.println(response.errorBody());
    }
}
    
answered by 02.02.2018 / 00:11
source