在另一个列表中解析命名 JSON 时出现 "No adapter attached; skipping layout" 错误
Getting "No adapter attached; skipping layout" error when parsing a named JSON inside another list
我想解析一些 JSON (Car models):
{"modelos": [{"nome": AMAROK},{"nome": JETTA}]}
我有以下代码:ADAPTER
public class ListaVeiculosAdapter extends RecyclerView.Adapter<ListaVeiculosAdapter.ListaVeiculosViewHolder> {
private List<VeiculosResponse> veiculos;
public ListaVeiculosAdapter(List<VeiculosResponse> veiculos) {
this.veiculos = veiculos;
}
public ListaVeiculosAdapter() {
}
@NonNull
@Override
public ListaVeiculosViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_veiculo, parent, false);
return new ListaVeiculosViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ListaVeiculosViewHolder holder, int position) {
holder.textNomeVeiculo.setText(veiculos.get(position).getNome());
}
@Override
public int getItemCount() {
return (veiculos!= null && veiculos.size()>0) ? veiculos.size() : 0;
}
static class ListaVeiculosViewHolder extends RecyclerView.ViewHolder{
private TextView textNomeVeiculo;
public ListaVeiculosViewHolder(View itemView){
super(itemView);
textNomeVeiculo = itemView.findViewById(R.id.text_veiculo);
}
}}
主要Activity:
RecyclerView recyclerVeiculos;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lista_veiculos);
// Toolbar toolbar = findViewById(R.id.my_toolbar);
//setSupportActionBar(toolbar);
recyclerVeiculos = findViewById(R.id.my_recycler_view);
ListaVeiculosAdapter adapter = new ListaVeiculosAdapter();
ApiService.getInstance().getModels().enqueue(new Callback<VeiculosResult>() {
@Override
public void onResponse(Call<VeiculosResult> call, Response<VeiculosResult> response) {
RecyclerView.LayoutManager linearLayoutManager = new LinearLayoutManager(ListaVeiculosActivity.this);
recyclerVeiculos.setLayoutManager(linearLayoutManager);
recyclerVeiculos.setAdapter(new ListaVeiculosAdapter(response.body().getModelos()));
}
@Override
public void onFailure(Call<VeiculosResult> call, Throwable t) {
}
});
}}
问题是我得到了错误
"E/RecyclerView: No adapter attached; skipping layout"
当我尝试 运行 应用程序时。
其他Retrofit配置代码:
public interface VeiculosService {
@GET("marcas/59/modelos")
Call<VeiculosResult> getModels();
}
private static VeiculosService INSTANCE;
public static VeiculosService getInstance() {
if(INSTANCE == null){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://parallelum.com.br/fipe/api/v1/carros/")
.addConverterFactory(MoshiConverterFactory.create())
.build();
INSTANCE = retrofit.create(VeiculosService.class);
}
return INSTANCE;
}
我的想法是创建一个包含车型的列表(回收站视图),以便用户可以选择他们想要的汽车。
您必须 set layout manager
和 set adapter
到您的 recyclerview
才能 API 打电话。
像这样修改你的MainActivity
。
RecyclerView recyclerVeiculos;
List<VeiculosResponse> veiculos;
ListaVeiculosAdapter adapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lista_veiculos);
// Toolbar toolbar = findViewById(R.id.my_toolbar);
//setSupportActionBar(toolbar);
recyclerVeiculos = findViewById(R.id.my_recycler_view);
RecyclerView.LayoutManager linearLayoutManager = new
LinearLayoutManager(ListaVeiculosActivity.this);
recyclerVeiculos.setLayoutManager(linearLayoutManager);
// create an empty list and pass it to your adapter
veiculos = new ArrayList<>()
adapter = new ListaVeiculosAdapter(veiculos)
recyclerVeiculos.setAdapter(adapter);
ApiService.getInstance().getModels().enqueue(new Callback<VeiculosResult>() {
@Override
public void onResponse(Call<VeiculosResult> call, Response<VeiculosResult> response) {
if (response.isSuccessful() && response.body() != null){
veiculos.addAll(response.body().getModelos());
// after getting new data you have to notify your adapter that your data set is changed like below.
adapter.notifyDataSetChanged();
}
}
@Override
public void onFailure(Call<VeiculosResult> call, Throwable t) {
}
});
// ...
我认为@Jakir 所说的将解决跳过适配器问题。当您将适配器附加到 recyclerView 的方式出现问题时,通常会发生这种情况。
//Set layoutmanager attaching adapter to recyclerView
recyclerView.setLayoutManager(myLayoutManager)
recyclerView.setAdapter(myAdapter);
myAdapter.notifyDatasetChanged();
然后,对于 json 响应,您需要为其创建一个 pojo classes。
这将获取 Json 个对象的数组。 ModelusData class 现在将包含个人模型信息
public class ModelusObject {
@SerializedName("modelus")
private List<ModelusData> list;
public List<ModelusData> getList() {
return list;
}
public void setList(List<ModelusData> list) {
this.list = list;
}
}
对于 ModelusData class
public class ModelusData{
@SerializedName("nome")
String nome;
@SerializedName("codigo")
String codigo;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCodigo() {
return codigo;
}
public void setCodigo(String codigo) {
this.codigo = codigo;
}
}
我想解析一些 JSON (Car models):
{"modelos": [{"nome": AMAROK},{"nome": JETTA}]}
我有以下代码:ADAPTER
public class ListaVeiculosAdapter extends RecyclerView.Adapter<ListaVeiculosAdapter.ListaVeiculosViewHolder> {
private List<VeiculosResponse> veiculos;
public ListaVeiculosAdapter(List<VeiculosResponse> veiculos) {
this.veiculos = veiculos;
}
public ListaVeiculosAdapter() {
}
@NonNull
@Override
public ListaVeiculosViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_veiculo, parent, false);
return new ListaVeiculosViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ListaVeiculosViewHolder holder, int position) {
holder.textNomeVeiculo.setText(veiculos.get(position).getNome());
}
@Override
public int getItemCount() {
return (veiculos!= null && veiculos.size()>0) ? veiculos.size() : 0;
}
static class ListaVeiculosViewHolder extends RecyclerView.ViewHolder{
private TextView textNomeVeiculo;
public ListaVeiculosViewHolder(View itemView){
super(itemView);
textNomeVeiculo = itemView.findViewById(R.id.text_veiculo);
}
}}
主要Activity:
RecyclerView recyclerVeiculos;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lista_veiculos);
// Toolbar toolbar = findViewById(R.id.my_toolbar);
//setSupportActionBar(toolbar);
recyclerVeiculos = findViewById(R.id.my_recycler_view);
ListaVeiculosAdapter adapter = new ListaVeiculosAdapter();
ApiService.getInstance().getModels().enqueue(new Callback<VeiculosResult>() {
@Override
public void onResponse(Call<VeiculosResult> call, Response<VeiculosResult> response) {
RecyclerView.LayoutManager linearLayoutManager = new LinearLayoutManager(ListaVeiculosActivity.this);
recyclerVeiculos.setLayoutManager(linearLayoutManager);
recyclerVeiculos.setAdapter(new ListaVeiculosAdapter(response.body().getModelos()));
}
@Override
public void onFailure(Call<VeiculosResult> call, Throwable t) {
}
});
}}
问题是我得到了错误
"E/RecyclerView: No adapter attached; skipping layout"
当我尝试 运行 应用程序时。
其他Retrofit配置代码:
public interface VeiculosService {
@GET("marcas/59/modelos")
Call<VeiculosResult> getModels();
}
private static VeiculosService INSTANCE;
public static VeiculosService getInstance() {
if(INSTANCE == null){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://parallelum.com.br/fipe/api/v1/carros/")
.addConverterFactory(MoshiConverterFactory.create())
.build();
INSTANCE = retrofit.create(VeiculosService.class);
}
return INSTANCE;
}
我的想法是创建一个包含车型的列表(回收站视图),以便用户可以选择他们想要的汽车。
您必须 set layout manager
和 set adapter
到您的 recyclerview
才能 API 打电话。
像这样修改你的MainActivity
。
RecyclerView recyclerVeiculos;
List<VeiculosResponse> veiculos;
ListaVeiculosAdapter adapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lista_veiculos);
// Toolbar toolbar = findViewById(R.id.my_toolbar);
//setSupportActionBar(toolbar);
recyclerVeiculos = findViewById(R.id.my_recycler_view);
RecyclerView.LayoutManager linearLayoutManager = new
LinearLayoutManager(ListaVeiculosActivity.this);
recyclerVeiculos.setLayoutManager(linearLayoutManager);
// create an empty list and pass it to your adapter
veiculos = new ArrayList<>()
adapter = new ListaVeiculosAdapter(veiculos)
recyclerVeiculos.setAdapter(adapter);
ApiService.getInstance().getModels().enqueue(new Callback<VeiculosResult>() {
@Override
public void onResponse(Call<VeiculosResult> call, Response<VeiculosResult> response) {
if (response.isSuccessful() && response.body() != null){
veiculos.addAll(response.body().getModelos());
// after getting new data you have to notify your adapter that your data set is changed like below.
adapter.notifyDataSetChanged();
}
}
@Override
public void onFailure(Call<VeiculosResult> call, Throwable t) {
}
});
// ...
我认为@Jakir 所说的将解决跳过适配器问题。当您将适配器附加到 recyclerView 的方式出现问题时,通常会发生这种情况。
//Set layoutmanager attaching adapter to recyclerView
recyclerView.setLayoutManager(myLayoutManager)
recyclerView.setAdapter(myAdapter);
myAdapter.notifyDatasetChanged();
然后,对于 json 响应,您需要为其创建一个 pojo classes。 这将获取 Json 个对象的数组。 ModelusData class 现在将包含个人模型信息
public class ModelusObject {
@SerializedName("modelus")
private List<ModelusData> list;
public List<ModelusData> getList() {
return list;
}
public void setList(List<ModelusData> list) {
this.list = list;
}
}
对于 ModelusData class
public class ModelusData{
@SerializedName("nome")
String nome;
@SerializedName("codigo")
String codigo;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCodigo() {
return codigo;
}
public void setCodigo(String codigo) {
this.codigo = codigo;
}
}