RecyclerView:没有附加适配器;跳过layou,翻新
大家晚上好,我一直在寻找一个解决方案,错误的android工作室的日志发送使用RecyclerView显示JSON“产品”列表与改造。RecyclerView:没有附加适配器;跳过layou,翻新
我已经阅读了与这个错误有关的问题,但我无法找到正确的答案来满足我的需求。
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工作室
RecyclerView:无适配器连接;跳过布局
RecyclerView:没有附加适配器;跳过布局
表面:getSlotFromBufferLocked:未知缓冲液:0xa3d9a700
OpenGLRenderer:endAllStagingAnimators上0xa2b6bb00(RippleDrawable)与手柄0xa200a310
java.lang中。IllegalStateException异常:预期BEGIN_OBJECT但BEGIN_ARRAY在行1列$
对于本proyect都使用了这个类和布局文件
“PRODUCTO” 级2路
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;
}
}
Both Contai 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();
}
用于回收站视图数据适配器称为 “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());
}
});
}
}
这是被用来
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布局的产品列表中的布局XML文件
<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>
一切都符合大和启动应用程序没有问题,但是当试图访问信息,它会发送本问题开头引用的日志消息。
非常感谢
一个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();
希望有所帮助。
不正确@ cricket_007,但无论如何感谢 –
实际上,是“预计BEGIN_OBJECT,但是BEGIN_ARRAY”...这是真正的错误,而不是“跳过布局” –