Recycleview没有用JSON和Retrofit填充?

问题描述 投票:0回答:1

我正在做一个简单的应用程序,用户将能够通过它的名字搜索书籍,与google.com书籍api。现在,我希望呈现一个名称中带有android的书籍列表。我正在用Retrofit2和RecycleView来做,但没有任何显示。MainActivity:

public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
KnjigaAdapter knjigaAdapter;
List<KnjigaModel> listaKnjiga;
public static final String BASE_URL = "https://www.googleapis.com/books/";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    uzmiKomentare();
}

public void uzmiKomentare() {

    Gson gson = new GsonBuilder().serializeNulls().create();
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create(gson))
            .build();
   KnjigaApi knjigaApi = retrofit.create(KnjigaApi.class);
     final Call<KnjigaModel> pozivZaListuKnjiga = knjigaApi.getKnjige("android");

    pozivZaListuKnjiga.enqueue(new Callback<KnjigaModel>() {
        @Override
        public void onResponse(Call<KnjigaModel> call, Response<KnjigaModel> response) {
            if (!response.isSuccessful()) {
                return;
            }
       //generateRecycleView(WHAT TO PUT HERE!!!!);
        }

        @Override
        public void onFailure(Call<KnjigaModel> call, Throwable t) {
            Log.d("MainActivity:", t.getMessage());
        }
    });
}
private void generateRecycleView(List<KnjigaModel> knjige) {
    listaKnjiga = new ArrayList<>();
    recyclerView = findViewById(R.id.recycleview);
    knjigaAdapter = new KnjigaAdapter(this, knjige);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    recyclerView.setAdapter(knjigaAdapter);
    if (knjigaAdapter.getItemCount() == 0){
        Log.i("List is empty: ","YES");
    }
    else {
        Log.i("list is empty: ","No");
    }
}

}

api inteface:

public interface KnjigaApi {
@GET("v1/volumes")
Call<KnjigaModel> getKnjige(@Query("q") String knjiga);

}

模型类。

public class KnjigaModel {
@SerializedName("title")
@Expose
private String imeKnjige;
@SerializedName("authors")
@Expose
private String imeAutora;
@SerializedName("thumbnail")
@Expose
private String slikaKnjige;

public KnjigaModel(String imeKnjige, String imeAutora,String slikaKnjige) {
    this.imeKnjige = imeKnjige;
    this.imeAutora = imeAutora;
    this.slikaKnjige = slikaKnjige;
}

public String getImeKnjige() {
    return imeKnjige;
}

public String getImeAutora() {
    return imeAutora;
}

public String getSlikaKnjige() {
    return slikaKnjige;
}

}

和我的适配器。

public class KnjigaAdapter extends RecyclerView.Adapter<KnjigaAdapter.KomentariViewHolder> {
private List<KnjigaModel> listaKnjiga;
private LayoutInflater inflater;
private Context context;

public KnjigaAdapter(Context context, List<KnjigaModel> listaKnjiga) {
    this.listaKnjiga = listaKnjiga;
    this.context = context;
}


@Override
public KomentariViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

     inflater = LayoutInflater.from(context);
    // Inflate the custom layout
    View postView = inflater.inflate(R.layout.single_item, parent, false);
    // Return a new holder instance
    return new KomentariViewHolder(postView);
}

@Override
public void onBindViewHolder(KomentariViewHolder holder, int position) {
    KnjigaModel knjige = listaKnjiga.get(position);
    holder.naslovKnjige.setText(knjige.getImeKnjige());
    holder.imeAutora.setText(knjige.getImeAutora());
    Glide.with(context)
            .load(knjige.getSlikaKnjige())
            .into(holder.slikaKnjige);
}

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


public class KomentariViewHolder extends RecyclerView.ViewHolder {
    private TextView naslovKnjige;
    private TextView imeAutora;
    private ImageView slikaKnjige;


    public KomentariViewHolder(View itemView) {
        super(itemView);

        naslovKnjige = itemView.findViewById(R.id.ime_knjige);
        imeAutora = itemView.findViewById(R.id.autor_knjige);
        slikaKnjige = itemView.findViewById(R.id.sika_korica);
    }
}

}

我的JSON格式。

https://www.googleapis.com/books/v1/volumes?q=android
android json retrofit retrofit2 recycler-adapter
1个回答
0
投票

首先,我强烈建议使用RxJava来处理异步请求,尽管它是完全可选的。

你的问题:你的 "getKnjige "方法只返回一个Model,虽然端点被命名为volumes(复数),你需要把你的KnjigaModel包装在一个类中,比如说:"KnjigaModel"。 data class KnjigaResponse(val items: List<KnjigaModel>)Kotlin为了简化,你也可以生成一个Java类,里面有一个单成员卷成员,持有KnjigaModel的列表)另外,你的模型是错误的。作者 不是一个字符串,而是一个字符串列表,而"缩略图"中包裹着一个"图片链接" 对象,和 标题 被包裹在 音量信息 对象。 那么你的改造界面就会是这样的。

public interface KnjigaApi {
@GET("v1/volumes")
Call<KnjigaResponse> getKnjige(@Query("q") String knjiga);

请求:

     final Call<KnjigaResponse> pozivZaListuKnjiga = knjigaApi.getKnjige("android");

    pozivZaListuKnjiga.enqueue(new Callback<KnjigaResponse>() {
        @Override
        public void onResponse(Call<KnjigaResponse> call, Response<KnjigaResponse> response) {
            if (!response.isSuccessful()) {
                return;
            }
         generateRecycleView(response.items);
        }

        @Override
        public void onFailure(Call<KnjigaResponse> call, Throwable t) {
            Log.d("MainActivity:", t.getMessage());
        }
    });
© www.soinside.com 2019 - 2024. All rights reserved.