我需要在适配器中创建一个RetrofitCall,这样我就可以像这样在onBindViewHolder中运行一个循环:
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());
}
});
所以我可以这样称呼:
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);
}
}
问题是在该代码运行之前没有进行改装调用,因此它会给出空指针异常并且应用程序崩溃。对我能做什么的猜测?我试过几个没有运气的答案(Asynctask和一个名为Rxjava的依赖) 请记住我是初学者,所以尽量保持精确。
答案 0 :(得分:0)
为了等待Retrofit,请将您的适配器完全加载到onResponse
。
不要只分配列表内容,实际创建带响应主体的适配器,并将其设置为RecyclerView
此外,这是如何正确设置适配器内容。您不希望取消引用适配器的列表对象
guardadas.clear();
guardadas.addAll(response.body());
adapter.notifyDataSetChanged();
删除while循环。您没有使用it.next()
,而您的onBind只应对列表中的一个视图负责
答案 1 :(得分:0)
我在西班牙语StackOverflow中得到了答案:
Retrofit异步执行onResponse方法,因此您需要在onResponse方法获得答案时执行的事件和事件。
创建一个界面,称之为OnOfertasResponse
:
public interface OnOfertasResponse
{
void ofertas(ArrayList<Oferta> ofertas);
}
&#39; ofertas&#39;当您获得服务器的响应时,将执行该方法。这称为回调
现在修改&#39; checkguardadas&#39;方法所以它接受回调,并在onResponse中执行&#39; ofertas&#39;方法
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());
}
});
}
所以要使用它,你只需要将回调发送给&#39; checkguardadas&#39;方法
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);
}
}
}
})