没有附加适配器,跳过 RecyclerView 中的布局
No adapter attached, skipping layout in RecyclerView
当我尝试从 JSON 加载数据时,我的 recyclerView 结果是空白的。
在 logcat 中,它表示 "No adapter attached; skipping layout"
这是我的activity
public class MainActivity extends AppCompatActivity {
private RecyclerView news;
private RecyclerView.Adapter news_adapter;
private List<News_Item> listItems;
private static final String news_data = "Url to Json file";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
news = (RecyclerView) findViewById(R.id.news);
news.setHasFixedSize(true);
news.setLayoutManager(new LinearLayoutManager(this));
listItems = new ArrayList<>();
loadRecyclerViewData();
}
private void loadRecyclerViewData(){
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Loading News...");
progressDialog.show();
StringRequest stringRequest = new StringRequest(Request.Method.GET,
news_data,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
progressDialog.dismiss();
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray array = jsonObject.getJSONArray("articles");
for(int i = 0; i < array.length(); i++){
JSONObject o = array.getJSONObject(i);
News_Item item = new News_Item(
o.getString("title"),
o.getString("description"),
o.getString("author"),
o.getString("urlToImage"),
o.getString("URL")
);
listItems.add(item);
}
news_adapter = new News_Adapter(listItems,getApplicationContext());
news.setAdapter(news_adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressDialog.dismiss();
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
}
但是当我如下加载虚拟数据时它工作正常
listItems = new ArrayList<>();
for(int i= 0; i<=10 ; i++){
News_Item news_item = new News_Item(
"Heading" + (i+1),
"Lorem Ipsum",
"Lorem Ipusm",
"Lorem Ipsum",
"Lorem Ipsum"
);
listItems.add(news_item);
}
news_adapter = new News_Adapter(listItems,this);
news.setAdapter(news_adapter);
我试图在 Whosebug 上阅读其他一些问题,但大多数都没有帮助 ,
,
question 3
这是我的 News_adapter
public class News_Adapter extends RecyclerView.Adapter<News_Adapter.ViewHolder> {
private List<News_Item> listItems;
private Context context;
public News_Adapter(List<News_Item> listItems, Context context) {
this.listItems = listItems;
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.card,parent,false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final News_Item item = listItems.get(position);
holder.news_title.setText(item.getTitle());
holder.news_desc.setText(item.getSubtitle());
holder.news_author.setText(item.getAuthor());
Picasso.with(context)
.load(item.getImg_url())
.into(holder.news_img);
holder.card_body.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "item clicked "+item.getTitle() , Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return listItems.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView news_title,news_desc,news_author;
public ImageView news_img;
public RelativeLayout card_body;
public ViewHolder(View itemView) {
super(itemView);
news_author = (TextView) itemView.findViewById(R.id.news_author);
news_desc = (TextView) itemView.findViewById(R.id.news_desc);
news_title = (TextView) itemView.findViewById(R.id.news_title);
news_img = (ImageView) itemView.findViewById(R.id.news_img);
card_body = (RelativeLayout) itemView.findViewById(R.id.card_body);
}
}
}
将行 -
news_adapter = new News_Adapter(listItems,getApplicationContext());
news.setAdapter(news_adapter);
在 onCreate()
方法中 loadRecyclerViewData()
调用
所以 onCreate()
就像 -
listItems = new ArrayList<>();
news_adapter = new News_Adapter(listItems,getApplicationContext());
news.setAdapter(news_adapter);
loadRecyclerViewData();
然后在您的 onResponse()
方法中执行 news_adapter.notifyDataSetChanged();
而不是上面的两行。
更新 1
将您的行 o.getString("URL")
替换为 o.getString("url")
。此外,不要使用 getString
,而是始终使用 optString
,这样即使某些信息不是来自 JSON,您的代码也不会中断。
当我尝试从 JSON 加载数据时,我的 recyclerView 结果是空白的。 在 logcat 中,它表示 "No adapter attached; skipping layout"
这是我的activity
public class MainActivity extends AppCompatActivity {
private RecyclerView news;
private RecyclerView.Adapter news_adapter;
private List<News_Item> listItems;
private static final String news_data = "Url to Json file";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
news = (RecyclerView) findViewById(R.id.news);
news.setHasFixedSize(true);
news.setLayoutManager(new LinearLayoutManager(this));
listItems = new ArrayList<>();
loadRecyclerViewData();
}
private void loadRecyclerViewData(){
final ProgressDialog progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Loading News...");
progressDialog.show();
StringRequest stringRequest = new StringRequest(Request.Method.GET,
news_data,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
progressDialog.dismiss();
try {
JSONObject jsonObject = new JSONObject(response);
JSONArray array = jsonObject.getJSONArray("articles");
for(int i = 0; i < array.length(); i++){
JSONObject o = array.getJSONObject(i);
News_Item item = new News_Item(
o.getString("title"),
o.getString("description"),
o.getString("author"),
o.getString("urlToImage"),
o.getString("URL")
);
listItems.add(item);
}
news_adapter = new News_Adapter(listItems,getApplicationContext());
news.setAdapter(news_adapter);
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressDialog.dismiss();
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);
}
}
但是当我如下加载虚拟数据时它工作正常
listItems = new ArrayList<>();
for(int i= 0; i<=10 ; i++){
News_Item news_item = new News_Item(
"Heading" + (i+1),
"Lorem Ipsum",
"Lorem Ipusm",
"Lorem Ipsum",
"Lorem Ipsum"
);
listItems.add(news_item);
}
news_adapter = new News_Adapter(listItems,this);
news.setAdapter(news_adapter);
我试图在 Whosebug 上阅读其他一些问题,但大多数都没有帮助
这是我的 News_adapter
public class News_Adapter extends RecyclerView.Adapter<News_Adapter.ViewHolder> {
private List<News_Item> listItems;
private Context context;
public News_Adapter(List<News_Item> listItems, Context context) {
this.listItems = listItems;
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.card,parent,false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final News_Item item = listItems.get(position);
holder.news_title.setText(item.getTitle());
holder.news_desc.setText(item.getSubtitle());
holder.news_author.setText(item.getAuthor());
Picasso.with(context)
.load(item.getImg_url())
.into(holder.news_img);
holder.card_body.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "item clicked "+item.getTitle() , Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return listItems.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
public TextView news_title,news_desc,news_author;
public ImageView news_img;
public RelativeLayout card_body;
public ViewHolder(View itemView) {
super(itemView);
news_author = (TextView) itemView.findViewById(R.id.news_author);
news_desc = (TextView) itemView.findViewById(R.id.news_desc);
news_title = (TextView) itemView.findViewById(R.id.news_title);
news_img = (ImageView) itemView.findViewById(R.id.news_img);
card_body = (RelativeLayout) itemView.findViewById(R.id.card_body);
}
}
}
将行 -
news_adapter = new News_Adapter(listItems,getApplicationContext());
news.setAdapter(news_adapter);
在 onCreate()
方法中 loadRecyclerViewData()
调用
所以 onCreate()
就像 -
listItems = new ArrayList<>();
news_adapter = new News_Adapter(listItems,getApplicationContext());
news.setAdapter(news_adapter);
loadRecyclerViewData();
然后在您的 onResponse()
方法中执行 news_adapter.notifyDataSetChanged();
而不是上面的两行。
更新 1
将您的行 o.getString("URL")
替换为 o.getString("url")
。此外,不要使用 getString
,而是始终使用 optString
,这样即使某些信息不是来自 JSON,您的代码也不会中断。