-1

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

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

Android:RecyclerView:没有附加适配器;跳过布局

未连接适配器;跳过布局recyclerview错误

recyclerview 没有附加适配器;跳过布局

未连接适配器;跳过布局 onCreateView()

这是 android studio 显示的错误日志

RecyclerView:没有附加适配器;跳过布局

RecyclerView:没有附加适配器;跳过布局

表面:getSlotFromBufferLocked:未知缓冲区:0xa3d9a700

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

java.lang.IllegalStateException:应为 BEGIN_OBJECT 但在第 1 行第 2 列路径 $ 处为 BEGIN_ARRAY

对于这个项目,使用了这个类和布局文件

“产品”类

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

            }
        });


    }
}

以及使用的 Layout 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>

一切都很好,并且可以毫无问题地启动应用程序,但是当尝试访问信息时,它会发送此问题开头引用的日志消息。

多谢

4

1 回答 1

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

希望有帮助。

于 2016-11-15T20:32:21.163 回答