【问题标题】:No adapter attached, skipping layout in RecyclerView [duplicate]没有附加适配器,在 RecyclerView 中跳过布局 [重复]
【发布时间】:2017-08-07 07:33:42
【问题描述】:

当我尝试从 JSON 加载数据时,我的 recyclerView 原来是空白的。 在 logcat 中,它说,“没有附加适配器;跳过布局”

这是我的活动

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

我试图在 stackoverflow 上阅读其他一些问题,但其中大多数都没有帮助 question 1,
question 2, 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);

    }
}

}

【问题讨论】:

  • 显示该消息是因为您附加的适配器没有数据。在这种情况下,recyclerview 不会被渲染。
  • 你确定你的response有数据吗?
  • @billynomates,是的,我正在从我正在使用的 URL 获取 JSON 文件。

标签: android json android-recyclerview recyclerview-layout


【解决方案1】:

放线 -

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(); 而不是上面的 2 行。

更新 1 将您的行 o.getString("URL") 替换为 o.getString("url")。另外,不要使用getString,而是始终使用optString,这样如果某些信息不是来自JSON,您的代码就不会中断。

【讨论】:

  • 我得到了相同的结果,但现在 logcat 说 this 谢谢你的回答。
  • 上面和下面是否还有错误。这似乎不是问题。我假设您的代码中已经拥有 Internet 权限
  • 不,就是这样..这是我在 logcat 中遇到的唯一错误。 !!! FAILED BINDER TRANSACTION !!! (parcel size = 60) 似乎是问题所在。我不知道那是什么
  • 所以没有适配器连接错误消失了?但RecyclerView中没有数据
  • this 是我用来获取 JSON 文件的链接。
猜你喜欢
  • 2015-09-01
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多