RecyclerView:没有连接适配器;跳过layou,改造

时间:2016-11-15 20:22:24

标签: android android-recyclerview gson retrofit woocommerce-rest-api

大家晚上好,我一直在寻找一个错误的解决方案android studio的日志正在使用RecyclerView发送一个带有改造的JSON“产品”列表。

我已经阅读了与此错误相关的问题,但我无法找到满足我需求的正确答案。

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()

这是android studio

显示的错误日志
  

RecyclerView:没有连接适配器;跳过布局

     

RecyclerView:没有连接适配器;跳过布局

     

Surface:getSlotFromBufferLocked:未知缓冲区:0xa3d9a700

     

OpenGLRenderer:0xa2b6bb00(RippleDrawable)上的endAllStagingAnimators,句柄为0xa200a310

     

java.lang.IllegalStateException:预期为BEGIN_OBJECT但在第1行第2行路径为BEGIN_ARRAY $

对于此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;
    }
}

这个类中包含的数组都称为“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());

            }
        });


    }
}

使用的布局XML文件

RecyclerView布局

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

一切都很顺利,并且没有问题地启动应用程序但是当尝试访问信息时,它会发送在此问题开头引用的日志消息。

非常感谢

1 个答案:

答案 0 :(得分:0)

如果没有提供必须显示的数据的适配器,RecyclerView就没有多大用处。因此,当初始化RecyclerView并将其放置在布局中但尚未调用.setAdapter时,会出现您遇到的问题。 您如何获取一个空列表并使用它来初始化适配器并在发送网络请求之前将其设置为您的RecyclerView。当您发出网络请求并获得响应时,只需清除旧的列表中的值,添加新值并通知适配器列表中的数据已更改。这应避免跳过布局问题,Alex。

这样的事情:

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();

希望有所帮助。