2017-11-29 5 views
0

Ich brauche einen RetrofitCall in einem Adapter zu machen, damit ich eine Schleife innerhalb eines onBindViewHolder wie folgt ausführen kann:Warte auf asynchrone Call Response Antwort auf einem Adapter?

public void checkguardadas(int id_usuario) { 

    RetrofitService retrofitService = RetrofitService.getInstance(); 
    PabloAPI api = retrofitService.getApiProxyServer(); 
    Call<ArrayList<Oferta>> call = api.getGuardadas(1); 

    call.enqueue(new Callback<ArrayList<Oferta>>() { 
     @Override 
     public void onResponse(Call<ArrayList<Oferta>> call, Response<ArrayList<Oferta>> response) { 

      Log.d("traza", "por aqui"); 
      Log.d("traza", response.body().toString()); 
      guardadas = response.body(); 


     } 

     @Override 
     public void onFailure(Call<ArrayList<Oferta>> call, Throwable t) { 
      Log.d("traza", "por alla"); 
      Log.d("traza", t.toString()); 
     } 
    }); 

So kann ich das nennen:

public void onBindViewHolder(final OfertasAdapter.MyViewHolder viewHolder, 
int i) { 
    Iterator it = guardadas.iterator(); 
    while (it.hasNext()) { 
     if (ofertaList.get(i).getId() == guardadas.get(i).getId()) { 
      viewHolder.guardar.setChecked(true); 
     } 
    } 

Das Problem ist, dass die Nachrüstung Der Aufruf wird nicht ausgeführt, bevor der Code ausgeführt wird. Daher gibt es eine Nullzeiger-Ausnahme und die App stürzt ab. Irgendeine Vermutung, was ich tun kann? Ich habe mit mehreren Antworten ohne Glück versucht (Asynctask und eine Abhängigkeit namens Rxjava).
Bitte denken Sie daran, ich bin ein Anfänger, also versuchen Sie so präzise wie möglich zu sein.

Antwort

0

Ich bekam eine Antwort in Spanisch Stackoverflow verantwortlich:

Retrofit führt die onResponse Methode asynchron, so dass Sie und Ereignis benötigen, die ausgeführt wird, wenn die onResponse-Methode erhält die Antwort.

eine Schnittstelle erstellen, rufen Sie es OnOfertasResponse:

public interface OnOfertasResponse 
{ 
    void ofertas(ArrayList<Oferta> ofertas); 
} 

Die Methode ‚ofertas‘ wird ausgeführt, wenn Sie die Antwort des Servers erhalten. Dies wird als Callback bekannt

Nun ändern Sie die ‚checkguardadas‘ Methode, so dass es den Rückruf akzeptiert, und in der onResponse führen Sie den ‚ofertas‘ Methode

public void checkguardadas(int id_usuario, OnOfertasResponse callback) { 
    RetrofitService retrofitService = RetrofitService.getInstance(); 
    PabloAPI api = retrofitService.getApiProxyServer(); 
    Call<ArrayList<Oferta>> call = api.getGuardadas(1); 

    call.enqueue(new Callback<ArrayList<Oferta>>() { 
     @Override 
     public void onResponse(Call<ArrayList<Oferta>> call, Response<ArrayList<Oferta>> response) { 

      Log.d("traza", "por aqui"); 
      Log.d("traza", response.body().toString()); 

      // ejecutamos el callback 
      callback.ofertas(response.body()); 
     } 

     @Override 
     public void onFailure(Call<ArrayList<Oferta>> call, Throwable t) { 
      Log.d("traza", "por alla"); 
      Log.d("traza", t.toString()); 
     } 
    }); 
} 

Also, es zu benutzen Sie einfach den Rückruf senden müssen zu 'checkguardadas' Methode

public void onBindViewHolder(final OfertasAdapter.MyViewHolder viewHolder, int i) { 

    // le enviamos el callback al metodo checkguardadas 
    checkguardadas(11,new OnOfertasResponse(){ 

     @Override 
     public void ofertas(ArrayList<Oferta> ofertas){ 
      // este metodo se ejecutara cuando onResponse se ejecute 
      Iterator it = ofertas.iterator(); 
      while (it.hasNext()) { 
       if (ofertaList.get(i).getId() == ofertas.get(i).getId()) { 
        viewHolder.guardar.setChecked(true); 
       } 
      } 
     } 
    }) 
0

Um auf Retrofit zu warten, laden Sie Ihren Adapter vollständig innerhalb von onResponse.

Sie nicht nur die Liste Inhalt zuweisen, tatsächlich den Adapter mit dem Antworttext erstellen, und legen Sie es auf eine RecyclerView bis

Auch dies ist, wie man richtig einen Adapter Inhalt auf. Sie möchten das Listenobjekt des Adapters nicht dereferenzieren

guardadas.clear(); 
guardadas.addAll(response.body()); 
adapter.notifyDataSetChanged(); 

Und entfernen Sie die While-Schleife. Sie verwenden nicht it.next() und Ihre onBind sollte nur für eine Ansicht in der Liste

+0

Wie kann ich den gesamten Adapter innerhalb der onResponse machen? Weil der Adapter eigentlich eine ganze Klasse sein soll? –

+0

Es gibt einen Unterschied zwischen der Definition einer Klasse und der Instantiierung einer "neuen" Klasse –

Verwandte Themen