Я сталкиваюсь с ошибкой "Нет подключенного адаптера; пропускает макет - PullRequest
1 голос
/ 31 марта 2020

Когда я пишу название своего вопроса, тогда этот сайт рекомендует мне какой-то ответ, но я не могу найти свой ответ, поэтому я пишу новый. Я пытаюсь простой RecyclerView, и он запускается успешно, но когда я получаю данные из inte rnet с использованием библиотеки залпа, я сталкиваюсь с этой ошибкой

, вот мой код

BusinessActivity. java

public class BusinessActivity extends AppCompatActivity {

    private final String URL = "https://api.myjson.com/bins/a44ec";
    private JsonArrayRequest request;
    private RequestQueue requestQueue;
    private List<ArticleModel> articleList;
    private RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_business);

        articleList = new ArrayList<>();
        recyclerView = findViewById(R.id.business_recyclerView);
        jsonParse();
    }

    private void jsonParse() {

        request = new JsonArrayRequest(URL, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {

                JSONObject jsonObject = null;
                for (int i=0;i<response.length();i++){

                    try {
                        jsonObject = response.getJSONObject(i);
                        ArticleModel article = new ArticleModel();
                        article.setTitle(jsonObject.getString("title"));
                        article.setAuthor(jsonObject.getString("author"));
                        article.setDescription(jsonObject.getString("description"));
                        article.setPublishedAt(jsonObject.getString("publishedAt"));
                        article.setUrlToImage(jsonObject.getString("urlToImage"));
                        articleList.add(article);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
                setRecyclerView(articleList);

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });

        requestQueue = Volley.newRequestQueue(BusinessActivity.this);
        requestQueue.add(request);
    }

    private void setRecyclerView(List<ArticleModel> articleList) {

        BusinessAdapter adapter = new BusinessAdapter(articleList,this);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(adapter);
    }
}

BusinessAdapter. java

 public class BusinessAdapter extends RecyclerView.Adapter<BusinessAdapter.MyViewHolder> {

    private List<ArticleModel> articleModels;
    private Context context;
    RequestOptions options;

    public BusinessAdapter(List<ArticleModel> articleModels, Context context) {
        this.articleModels = articleModels;
        this.context = context;

        options = new RequestOptions().centerCrop().placeholder(R.drawable.ic_launcher_background).error(R.drawable.ic_launcher_background);
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.category_row,parent,false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        ArticleModel articleModel = articleModels.get(position);

        holder.title.setText(articleModel.getTitle());
        holder.author.setText(articleModel.getAuthor());
        holder.desc.setText(articleModel.getDescription());
        holder.date.setText(articleModel.getPublishedAt());

        Glide.with(context).load(articleModel.getUrlToImage()).apply(options).into(holder.image);
    }

    @Override
    public int getItemCount() {
        return articleModels.size();
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {

        TextView title,author,desc,date;
        ImageView image;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);

            title = itemView.findViewById(R.id.title);
            author = itemView.findViewById(R.id.author);
            desc = itemView.findViewById(R.id.detail);
            date = itemView.findViewById(R.id.date);
            image = itemView.findViewById(R.id.image);
        }
    }
}

Журнал ошибок

2020-04-01 00:15:53.117 8821-8821/com.atc.newsappproject E/RecyclerView: No adapter attached; skipping layout
2020-04-01 00:15:53.118 1752-1787/? E/storaged: getDiskStats failed with result NOT_SUPPORTED and size 0

Как решить эту проблему?

Спасибо.

1 Ответ

1 голос
/ 01 апреля 2020

Эта ошибка обычно возникает, если вы не установили RecyclerView при создании фрагмента или действия. Чтобы это исправить, вам нужно:

  1. Установить RecyclerView в onCreate вместо того, чтобы вы получили результат. Вы устанавливаете это с пустым списком.
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_business);

    articleList = new ArrayList<>();
    recyclerView = findViewById(R.id.business_recyclerView);
    setRecyclerView(articleList);
    jsonParse();
}
Вы создаете сеттер в вашем Adapter
public void setArticles(ArrayList<ArticleModel> articles){

    this.articles = articles;
    notifyDataSetChanged();
}

Создать private BusinessAdapter adapter; ниже private RecyclerView recyclerView;

Наконец-то на ваш onResponse вы звоните adapter.setArticles(articlesList);

Здесь это ссылка с множеством решений, если проблема не устранена: recyclerview Адаптер не подключен; пропускающий макет

...