正在获取“未连接适配器;另一个列表中解析命名的JSON时出现“跳过布局”错误

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

我想解析一些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);
    }

}}

主要活动:

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"

当我尝试运行该应用程序时。

其他改造配置代码:

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;
}

我的想法是创建带有汽车模型的列表(回收者视图),以便用户可以选择他们想要的汽车。

android retrofit adapter
2个回答
1
投票

在调用API之前,您必须set layout managerset adapterrecyclerview

这样修改您的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) {

        }
    });





// ...

0
投票

我认为@Jakir所说的将解决跳过的问题。当您将适配器连接到recyclerView的方式存在问题时,通常会发生这种情况。

//Set layoutmanager attaching adapter to recyclerView
recyclerView.setLayoutManager(myLayoutManager)
recyclerView.setAdapter(myAdapter);

myAdapter.notifyDatasetChanged();

然后对于json响应,您需要为其创建一个pojo类。这将获取Json对象的数组。 ModelusData类现在将包含各个模型信息]

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类

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; 
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.