没有附加适配器,跳过 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,您的代码也不会中断。