-1

Добрый вечер, все, Ive искал решение ошибки. Журнал андроид-студии отправляет с помощью RecyclerView, чтобы показать список продуктов «JSON» с модификацией.RecyclerView: адаптер не подключен; skipping layou, retrofit

Я уже прочитал вопросы, связанные с этой ошибкой, но я не смог найти правильный ответ на мои потребности.

Android: RecyclerView: No adapter attached; skipping layout

No adapter attached; skipping layout recyclerview error

recyclerview No adapter attached; skipping layout

No adapter attached; skipping layout onCreateView()

Это де журнал ошибок показал на андроид студии

RecyclerView: адаптер не прилагается; пропуская макет

RecyclerView: адаптер не прилагается; пропуск компоновки

Поверхность: getSlotFromBufferLocked: неизвестный буфер: 0xa3d9a700

OpenGLRenderer: endAllStagingAnimators на 0xa2b6bb00 (RippleDrawable) с ручкой 0xa200a310

java.lang.IllegalStateException: Ожидаемое BEGIN_OBJECT но BEGIN_ARRAY в строке 1 колонка 2 путь $

Для этого proyect которые были использованы эти классы и раскладка

"Producto" Класс

public class Producto { 

    @SerializedName("id") 
    @Expose 
    private int id; 
    @SerializedName("name") 
    @Expose 
    private String name; 
    @SerializedName("status") 
    @Expose 
    private String status; 
    @SerializedName("price") 
    @Expose 
    private String price; 
    @SerializedName("regular_price") 
    @Expose 
    private String regularPrice; 
    @SerializedName("sale_price") 
    @Expose 
    private String salePrice; 
    @SerializedName("price_html") 
    @Expose 
    private String priceHtml; 
    @SerializedName("on_sale") 
    @Expose 
    private boolean onSale; 
    @SerializedName("total_sales") 
    @Expose 
    private int totalSales; 
    @SerializedName("purchase_note") 
    @Expose 
    private String purchaseNote; 
    @SerializedName("categories") 
    @Expose 
    private List<Category> categories; 
    @SerializedName("menu_order") 
    @Expose 
    private int menuOrder; 


    /** 
    * 
    * @return 
    * The id 
    */ 
    public int getId() { 
     return id; 
    } 

    /** 
    * 
    * @param id 
    * The id 
    */ 
    public void setId(int id) { 
     this.id = id; 
    } 

    /** 
    * 
    * @return 
    * The name 
    */ 
    public String getName() { 
     return name; 
    } 

    /** 
    * 
    * @param name 
    * The name 
    */ 
    public void setName(String name) { 
     this.name = name; 
    } 

    /** 
    * 
    * @return 
    * The status 
    */ 
    public String getStatus() { 
     return status; 
    } 

    /** 
    * 
    * @param status 
    * The status 
    */ 
    public void setStatus(String status) { 
     this.status = status; 
    } 

    /** 
    * 
    * @return 
    * The price 
    */ 
    public String getPrice() { 
     return price; 
    } 

    /** 
    * 
    * @param price 
    * The price 
    */ 
    public void setPrice(String price) { 
     this.price = price; 
    } 

    /** 
    * 
    * @return 
    * The regularPrice 
    */ 
    public String getRegularPrice() { 
     return regularPrice; 
    } 

    /** 
    * 
    * @param regularPrice 
    * The regular_price 
    */ 
    public void setRegularPrice(String regularPrice) { 
     this.regularPrice = regularPrice; 
    } 

    /** 
    * 
    * @return 
    * The salePrice 
    */ 
    public String getSalePrice() { 
     return salePrice; 
    } 

    /** 
    * 
    * @param salePrice 
    * The sale_price 
    */ 
    public void setSalePrice(String salePrice) { 
     this.salePrice = salePrice; 
    } 

    /** 
    * 
    * @return 
    * The priceHtml 
    */ 
    public String getPriceHtml() { 
     return priceHtml; 
    } 

    /** 
    * 
    * @param priceHtml 
    * The price_html 
    */ 
    public void setPriceHtml(String priceHtml) { 
     this.priceHtml = priceHtml; 
    } 

    /** 
    * 
    * @return 
    * The onSale 
    */ 
    public boolean isOnSale() { 
     return onSale; 
    } 

    /** 
    * 
    * @param onSale 
    * The on_sale 
    */ 
    public void setOnSale(boolean onSale) { 
     this.onSale = onSale; 
    } 

    /** 
    * 
    * @return 
    * The totalSales 
    */ 
    public int getTotalSales() { 
     return totalSales; 
    } 

    /** 
    * 
    * @param totalSales 
    * The total_sales 
    */ 
    public void setTotalSales(int totalSales) { 
     this.totalSales = totalSales; 
    } 

    /** 
    * 
    * @return 
    * The purchaseNote 
    */ 
    public String getPurchaseNote() { 
     return purchaseNote; 
    } 

    /** 
    * 
    * @param purchaseNote 
    * The purchase_note 
    */ 
    public void setPurchaseNote(String purchaseNote) { 
     this.purchaseNote = purchaseNote; 
    } 

    /** 
    * 
    * @return 
    * The categories 
    */ 
    public List<Category> getCategories() { 
     return categories; 
    } 

    /** 
    * 
    * @param categories 
    * The categories 
    */ 
    public void setCategories(List<Category> categories) { 
     this.categories = categories; 
    } 

    /** 
    * 
    * @return 
    * The menuOrder 
    */ 
    public int getMenuOrder() { 
     return menuOrder; 
    } 

    /** 
    * 
    * @param menuOrder 
    * The menu_order 
    */ 
    public void setMenuOrder(int menuOrder) { 
     this.menuOrder = menuOrder; 
    } 

} 

"Категория" Класс (который совпадает с private List<Category> categories; собственности)

public class Category { 

    @SerializedName("id") 
    @Expose 
    private int id; 
    @SerializedName("name") 
    @Expose 
    private String name; 
    @SerializedName("slug") 
    @Expose 
    private String slug; 

    /** 
    * 
    * @return 
    * The id 
    */ 
    public int getId() { 
     return id; 
    } 

    /** 
    * 
    * @param id 
    * The id 
    */ 
    public void setId(int id) { 
     this.id = id; 
    } 

    /** 
    * 
    * @return 
    * The name 
    */ 
    public String getName() { 
     return name; 
    } 

    /** 
    * 
    * @param name 
    * The name 
    */ 
    public void setName(String name) { 
     this.name = name; 
    } 

    /** 
    * 
    * @return 
    * The slug 
    */ 
    public String getSlug() { 
     return slug; 
    } 

    /** 
    * 
    * @param slug 
    * The slug 
    */ 
    public void setSlug(String slug) { 
     this.slug = slug; 
    } 
} 

И содер nanied, как Массивы в этом классе под названием "JSONproducts"

public class JSONproducts { 

    private Producto[] products; 
    private Category[] categories; 

    public Producto[] getProducts(){ 

     return products; 
    } 

    public Category[] getCategories(){ 
     return categories; 
    } 
} 

Затем Запроса интерфейс называется "LecturaProductos"

public interface LecturaProductos { 

    @GET("Products") 
    Call<JSONproducts> ListarProductos(); 

} 

Адаптер данных для Recycler View называется "Adaptador"

public class Adaptador extends RecyclerView.Adapter<Adaptador.ViewHolder> { 

    private ArrayList<Producto> productos; 
    private ArrayList<Category> categoria; 

    public Adaptador(ArrayList<Producto> productos, ArrayList<Category> categoria){ 
     this.productos = productos; 
     this.categoria = categoria; 
    } 

    @Override 
    public Adaptador.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.product_view, parent, false); 

     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(Adaptador.ViewHolder holder, int position) { 
     holder.nom_pro_tv.setText(productos.get(position).getName()); 
     holder.id_pro_tv.setText(productos.get(position).getId()); 
     holder.cat_pro.setText(categoria.get(position).getName()); 

    } 

    @Override 
    public int getItemCount() { 

     return productos.size(); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder{ 
     private TextView nom_pro_tv, id_pro_tv, cat_pro; 
     public ViewHolder(View itemView) { 
      super(itemView); 

      nom_pro_tv = (TextView)itemView.findViewById(R.id.nom_pro_tv); 
      id_pro_tv = (TextView)itemView.findViewById(R.id.id_pro_tv); 
      cat_pro = (TextView)itemView.findViewById(R.id.cat_pro_tv); 
     } 
    } 
} 

И класс деятельности «ListaProductos»

public class ListaProductos extends AppCompatActivity { 

    private RecyclerView recyclerView; 
    private ArrayList<Producto> product; 
    private ArrayList<Category> category; 
    private Adaptador adaptador; 



    public static final String BASE_URL= "https://mydomain.com.mx/wp-json/wc/v1/"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_lista_productos); 
     showView(); 

    } 

    private void showView(){ 
     recyclerView = (RecyclerView)findViewById(R.id.prod_recycler_view); 
     recyclerView.setHasFixedSize(true); 
     RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); 
     recyclerView.setLayoutManager(layoutManager); 
     cargarJSON(); 

    } 

    private void cargarJSON(){ 
     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(BASE_URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     final LecturaProductos producto = retrofit.create(LecturaProductos.class); 
     Call<JSONproducts> productoCall = producto.ListarProductos(); 
     productoCall.enqueue(new Callback<JSONproducts>() { 
      @Override 
      public void onResponse(Call<JSONproducts> call, Response<JSONproducts> response) { 

       JSONproducts jsonproducts = response.body(); 
       product = new ArrayList<>(Arrays.asList(jsonproducts.getProducts())); 
       category = new ArrayList<>(Arrays.asList(jsonproducts.getCategories())); 
       adaptador = new Adaptador(product, category); 
       recyclerView.setAdapter(adaptador); 
      } 

      @Override 
      public void onFailure(Call<JSONproducts> call, Throwable t) { 
       Log.d("Error", t.getMessage()); 

      } 
     }); 


    } 
} 

И Layout XML-файлы, которые были использованы

RecyclerView Layout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/activity_lista_productos" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="mx.com.corpcap.elrollorepartidor.ListaProductos"> 

<android.support.v7.widget.RecyclerView 
    android:id="@+id/prod_recycler_view" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent"/></LinearLayout> 

CardView Макет для списка продуктов

<android.support.v7.widget.CardView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <TextView 
      android:id="@+id/nom_pro_tv" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textStyle="bold" 
      android:textSize="16sp" 
      android:layout_marginTop="10dp" 
      android:layout_marginBottom="10dp"/> 

     <TextView 
      android:id="@+id/id_pro_tv" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

     <TextView 
      android:id="@+id/cat_pro_tv" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 
</android.support.v7.widget.CardView> 

Все соответствует большой и запускает приложение без проблем, но когда информация пытается получить доступ, она отправляет сообщения журнала, указанные в начале этого вопроса.

Спасибо Лот

+0

Не совсем @ cricket_007, но спасибо в любом случае –

+0

На самом деле, да «Ожидалось BEGIN_OBJECT, но было BEGIN_ARRAY» ... Это настоящая ошибка, не столько «пропуская макет», –

ответ

0

RecyclerView не так много использования на своем собственном без адаптера, обеспечивающего данные, которые он должен отображать. Поэтому, когда RecyclerView инициализируется и помещается в макет, но .setAdapter еще не вызван, возникает проблема, с которой вы столкнулись. Как насчет того, чтобы вы берете пустой список и используете его для инициализации адаптера и установки его в RecyclerView, прежде чем отправлять сетевой запрос. Когда вы делаете сетевой запрос и получаете ответ, просто очистите старые значения в списке, добавьте новые значения и сообщите адаптеру, что данные в списке изменились. Это должно избежать проблемы с пропуском макета, Алекс.

Что-то вроде этого:

private ArrayList<YourObjectClass> listOfYourObjects = new ArrayList<>(); 
. 
. 
. 
SomeAdapter yourAdapter = new SomeAdapter(listOfYourObjects , context); 
yourRecyclerView.setAdapter(yourAdapter); 
. 
. 
. 
onResponse: 
list.clear(); 
//Let the adapter know the list is empty now 
yourAdapter.notifyDataSetChanged(); 
//Fill in your list with values from server using a for/while loop etc. 
//Again notify your adapter that the list has changed: 
yourAdapter.notifyDataSetChanged(); 

Надежда, что помогает.

Смежные вопросы