E/RecyclerView:没有连接适配器;跳过布局
E/RecyclerView: No adapter attached; skipping layout
我一直在 Whosebug 上阅读不同的答案,我尝试实施该解决方案,但我仍然遇到同样的错误,我不知道为什么! :/
这是我的适配器 Class :
public class RecipesAdapter extends RecyclerView.Adapter <RecipesAdapter.RecipeHolder>{
private List<Recipes> recipesList;
private static Recipes recipe;
private static Intent intent;
private Context context;
private View row;
private RecipeHolder holder;
//Conctructor
public RecipesAdapter(List<Recipes> recipesList)
{
this.recipesList=recipesList;
}
//create holder (view)
@Override
public RecipeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
row= LayoutInflater.from(parent.getContext()).inflate(R.layout.recipe_row, parent,false);
//Call constructor : Holder
holder=new RecipeHolder(row);
return holder;
}
@Override
public void onBindViewHolder(RecipeHolder holder, int position) {
recipe= recipesList.get(position);
holder.recipe_title.setText(recipe.getTitle());
Picasso.with(holder.recipe_image.getContext()).load(recipe.getImage_url()).into(holder.recipe_image);
holder.recipe_rank.setText(recipe.getSocial_rank().split("\.",2)[0]);
holder.recipe_publisher.setText(recipe.getPublisher());
}
@Override
public int getItemCount() {
return recipesList.size();
}
/*To avoid calling methods findViewById for each view, Android has added a concept called ViewHolder
to change 'the values' of each View => concept of Recycling */
public class RecipeHolder extends RecyclerView.ViewHolder
{
private ImageView recipe_image;
private TextView recipe_title,recipe_rank,recipe_publisher;
public RecipeHolder(View itemView) {
super(itemView);
recipe_image=(ImageView) itemView.findViewById(R.id.recipe_img);
recipe_title=(TextView) itemView.findViewById(R.id.recipe_title);
recipe_rank=(TextView) itemView.findViewById(R.id.recipe_rank);
recipe_publisher=(TextView) itemView.findViewById(R.id.recipe_publisher);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
context = v.getContext();
intent = new Intent(context, DetailRecipe.class);
intent.putExtra("url",recipesList.get(getAdapterPosition()).getF2f_url());
intent.putExtra("image",recipesList.get(getAdapterPosition()).getImage_url());
Log.e("log","url is : "+recipe.getF2f_url());
context.startActivity(intent);
}});
}
}
}
onCreate 方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.cookingrecipes);
// Adding Toolbar to Main screen
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Connection_GetData();
}
onResponse 方法:连接成功时
I used Retrofit library to get data, I called Display_Recipes() to set Adapter
`@Override
public void onResponse(Call<ResultRecipes> call, Response<ResultRecipes> response) {
recipesList = response.body().getRecipes();
//Recycler View
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
/*Performance*/
recyclerView.setItemViewCacheSize(24);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
recyclerView.setLayoutManager(new GridLayoutManager(CookingRecipes.this, 2));
/*Treatment - Display*/
Display_Recipes();
}`
Display_Recipes() 方法
`public void Display_Recipes() {
//Setup Adapter
this.recipeAdapter = new RecipesAdapter(recipesList);
recyclerView.setAdapter(recipeAdapter);
}`
Image Log
非常感谢,
有必要在主线程上设置 LayoutManager 而不是在任何回调中调用。
按照以下更新您的 onCreate 方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.cookingrecipes);
// Adding Toolbar to Main screen
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//Shifted your recycler view code here
//Recycler View
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
/*Performance*/
recyclerView.setItemViewCacheSize(24);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
recyclerView.setLayoutManager(new GridLayoutManager(CookingRecipes.this, 2));
// Only pass context to your adapter
recyclerView.setAdapter(new RecipesAdapter(CookingRecipes.this);
Connection_GetData();
}
并更新您的 onResponse 回调:
@Override
public void onResponse(Call<ResultRecipes> call, Response<ResultRecipes> response) {
recipesList = response.body().getRecipes();
/*Treatment - Display*/
Display_Recipes();
}
创建方法以在需要传递更新列表时更新适配器中的列表:
public void udpateList(List<Recipes> recipesList){
this.recipesList = recipesList;
notifyDataSetChanged();
}
现在从您的 Display_Recipes 方法中调用此方法
public void Display_Recipes() {
//Update Adapter
udpateList(recipesList);
}
问题可能是适配器没有告诉 RecyclerView
更新其内容。
在您的RecipeAdapter
中添加一个方法:
public void refresh() {
notifyDataSetChanged();
}
然后在将适配器绑定到 RecyclerView
;
之后调用它
recyclerView.setAdapter(recipeAdapter);
recipeAdapter.update();
我的是在adapter初始化时先输入一个空列表数据,然后再更新数据解决的,例子:
在 onCreate() 中初始化适配器:
onCreate() {
...
initRecyclerView();
...
}
initRecyclerView() :
public void initRecyclerView() {
//setup recyclerview
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
/*Performance*/
recyclerView.setItemViewCacheSize(24);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
recyclerView.setLayoutManager(new GridLayoutManager(CookingRecipes.this, 2));
//Setup Adapter
this.recipeAdapter = new RecipesAdapter(new List());//try to set an empty adapter here first
recyclerView.setAdapter(recipeAdapter);
}
然后里面 onResponse
:
@Override
public void onResponse(Call<ResultRecipes> call, Response<ResultRecipes> response) {
//only do data update inside onResponse
recipesList = response.body().getRecipes();
recipeAdapter.recipesList = recipesList;
notifyDataSetChanged();
}
Thank you all my friends, I was discovered the error, the code is correct but to avoid this warning, we need to set an empty adapter in onCreate method. After inside the method that you want to get the data, in my case with Retrofit library : Connection_GetData();
1 - 像那样创建 class 适配器
public class AdapterFirstUse extends RecyclerView.Adapter {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
}
2 - onCreate(Bundle savedInstanceState) 方法内部
recyclerView.setAdapter(new AdapterFirstUse());
3 - 内部 Connection_GetData()
Setup our Adapter
//Setup Adapter
recipeAdapter = new RecipesAdapter(recipesList);
recyclerView.setAdapter(recipeAdapter);
就这些了,谢谢。
我一直在 Whosebug 上阅读不同的答案,我尝试实施该解决方案,但我仍然遇到同样的错误,我不知道为什么! :/
这是我的适配器 Class :
public class RecipesAdapter extends RecyclerView.Adapter <RecipesAdapter.RecipeHolder>{
private List<Recipes> recipesList;
private static Recipes recipe;
private static Intent intent;
private Context context;
private View row;
private RecipeHolder holder;
//Conctructor
public RecipesAdapter(List<Recipes> recipesList)
{
this.recipesList=recipesList;
}
//create holder (view)
@Override
public RecipeHolder onCreateViewHolder(ViewGroup parent, int viewType) {
row= LayoutInflater.from(parent.getContext()).inflate(R.layout.recipe_row, parent,false);
//Call constructor : Holder
holder=new RecipeHolder(row);
return holder;
}
@Override
public void onBindViewHolder(RecipeHolder holder, int position) {
recipe= recipesList.get(position);
holder.recipe_title.setText(recipe.getTitle());
Picasso.with(holder.recipe_image.getContext()).load(recipe.getImage_url()).into(holder.recipe_image);
holder.recipe_rank.setText(recipe.getSocial_rank().split("\.",2)[0]);
holder.recipe_publisher.setText(recipe.getPublisher());
}
@Override
public int getItemCount() {
return recipesList.size();
}
/*To avoid calling methods findViewById for each view, Android has added a concept called ViewHolder
to change 'the values' of each View => concept of Recycling */
public class RecipeHolder extends RecyclerView.ViewHolder
{
private ImageView recipe_image;
private TextView recipe_title,recipe_rank,recipe_publisher;
public RecipeHolder(View itemView) {
super(itemView);
recipe_image=(ImageView) itemView.findViewById(R.id.recipe_img);
recipe_title=(TextView) itemView.findViewById(R.id.recipe_title);
recipe_rank=(TextView) itemView.findViewById(R.id.recipe_rank);
recipe_publisher=(TextView) itemView.findViewById(R.id.recipe_publisher);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
context = v.getContext();
intent = new Intent(context, DetailRecipe.class);
intent.putExtra("url",recipesList.get(getAdapterPosition()).getF2f_url());
intent.putExtra("image",recipesList.get(getAdapterPosition()).getImage_url());
Log.e("log","url is : "+recipe.getF2f_url());
context.startActivity(intent);
}});
}
}
}
onCreate 方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.cookingrecipes);
// Adding Toolbar to Main screen
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
Connection_GetData();
}
onResponse 方法:连接成功时
I used Retrofit library to get data, I called Display_Recipes() to set Adapter
`@Override
public void onResponse(Call<ResultRecipes> call, Response<ResultRecipes> response) {
recipesList = response.body().getRecipes();
//Recycler View
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
/*Performance*/
recyclerView.setItemViewCacheSize(24);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
recyclerView.setLayoutManager(new GridLayoutManager(CookingRecipes.this, 2));
/*Treatment - Display*/
Display_Recipes();
}`
Display_Recipes() 方法
`public void Display_Recipes() {
//Setup Adapter
this.recipeAdapter = new RecipesAdapter(recipesList);
recyclerView.setAdapter(recipeAdapter);
}`
Image Log 非常感谢,
有必要在主线程上设置 LayoutManager 而不是在任何回调中调用。
按照以下更新您的 onCreate 方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.cookingrecipes);
// Adding Toolbar to Main screen
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
//Shifted your recycler view code here
//Recycler View
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
/*Performance*/
recyclerView.setItemViewCacheSize(24);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
recyclerView.setLayoutManager(new GridLayoutManager(CookingRecipes.this, 2));
// Only pass context to your adapter
recyclerView.setAdapter(new RecipesAdapter(CookingRecipes.this);
Connection_GetData();
}
并更新您的 onResponse 回调:
@Override
public void onResponse(Call<ResultRecipes> call, Response<ResultRecipes> response) {
recipesList = response.body().getRecipes();
/*Treatment - Display*/
Display_Recipes();
}
创建方法以在需要传递更新列表时更新适配器中的列表:
public void udpateList(List<Recipes> recipesList){
this.recipesList = recipesList;
notifyDataSetChanged();
}
现在从您的 Display_Recipes 方法中调用此方法
public void Display_Recipes() {
//Update Adapter
udpateList(recipesList);
}
问题可能是适配器没有告诉 RecyclerView
更新其内容。
在您的RecipeAdapter
中添加一个方法:
public void refresh() {
notifyDataSetChanged();
}
然后在将适配器绑定到 RecyclerView
;
recyclerView.setAdapter(recipeAdapter);
recipeAdapter.update();
我的是在adapter初始化时先输入一个空列表数据,然后再更新数据解决的,例子:
在 onCreate() 中初始化适配器:
onCreate() {
...
initRecyclerView();
...
}
initRecyclerView() :
public void initRecyclerView() {
//setup recyclerview
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
/*Performance*/
recyclerView.setItemViewCacheSize(24);
recyclerView.setDrawingCacheEnabled(true);
recyclerView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
recyclerView.setLayoutManager(new GridLayoutManager(CookingRecipes.this, 2));
//Setup Adapter
this.recipeAdapter = new RecipesAdapter(new List());//try to set an empty adapter here first
recyclerView.setAdapter(recipeAdapter);
}
然后里面 onResponse
:
@Override
public void onResponse(Call<ResultRecipes> call, Response<ResultRecipes> response) {
//only do data update inside onResponse
recipesList = response.body().getRecipes();
recipeAdapter.recipesList = recipesList;
notifyDataSetChanged();
}
Thank you all my friends, I was discovered the error, the code is correct but to avoid this warning, we need to set an empty adapter in onCreate method. After inside the method that you want to get the data, in my case with Retrofit library : Connection_GetData();
1 - 像那样创建 class 适配器
public class AdapterFirstUse extends RecyclerView.Adapter {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
}
@Override
public int getItemCount() {
return 0;
}
}
2 - onCreate(Bundle savedInstanceState) 方法内部
recyclerView.setAdapter(new AdapterFirstUse());
3 - 内部 Connection_GetData()
Setup our Adapter
//Setup Adapter
recipeAdapter = new RecipesAdapter(recipesList);
recyclerView.setAdapter(recipeAdapter);
就这些了,谢谢。