Адаптер не подключен, пропущен макет фрагмента - PullRequest
0 голосов
/ 20 февраля 2020

Я пробовал несколько разных способов исправить это, но, похоже, просто не хочет работать. Я приложил этот фрагмент. Recyclelerview работает, когда я использую функцию поиска; Однако, когда я впервые загружаю страницу, я получаю сообщение об ошибке:

E/RecyclerView: No adapter attached; skipping layout

Я думаю, что это может быть проблема с onCreate против onCreateView, но я не совсем уверен, что и куда помещать.

NewsFragment. java



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        v = inflater.inflate(R.layout.fragment_news, container, false);
        swipeRefreshLayout = v.findViewById(R.id.swipeRefresh);
        recyclerView = v.findViewById(R.id.news_recyclerView);


        etQuery = v.findViewById(R.id.etQuery);
        btnSearch = v.findViewById(R.id.btnSearch);

        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

        final String country = getCountry();

        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                retrieveJson("", country, API_KEY);
            }
        });
        retrieveJson("", country, API_KEY);


        btnSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!etQuery.getText().toString().equals("")) {
                    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                        @Override
                        public void onRefresh() {
                            retrieveJson(etQuery.getText().toString(), country, API_KEY);
                        }
                    });
                    retrieveJson(etQuery.getText().toString(), country, API_KEY);
                } else {
                    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                        @Override
                        public void onRefresh() {
                            retrieveJson("", country, API_KEY);
                        }
                    });
                    retrieveJson("", country, API_KEY);
                }
            }
        });
        return v;

    }

    public void retrieveJson(String query ,String country, String apiKey){

        swipeRefreshLayout.setRefreshing(true);
        Call<Headlines> call;
        if (!etQuery.getText().toString().equals("")){
            call=NewsApiClient.getInstance().getApi().getSpecificData(query,apiKey);

        }else{
            call=NewsApiClient.getInstance().getApi().getHeadlines(country,apiKey);
        }

        call.enqueue(new Callback<Headlines>() {
            @Override
            public void onResponse(Call<Headlines> call, Response<Headlines> response) {
                if (response.isSuccessful() && response.body().getArticles() != null ){
                    swipeRefreshLayout.setRefreshing(false);
                    articles.clear();
                    articles = response.body().getArticles();
                    newsAdapter = new NewsAdapter(getContext(), articles);
                    recyclerView.setAdapter(newsAdapter);
                }
            }

            @Override
            public void onFailure(Call<Headlines> call, Throwable t) {
                swipeRefreshLayout.setRefreshing(false);
                Toast.makeText(getContext(), t.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
            }
        });

    }

    public String getCountry(){
        Locale locale = Locale.getDefault();
        String country = locale.getCountry();
        return country.toLowerCase();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


    }


}

1 Ответ

0 голосов
/ 20 февраля 2020

В onCreateView вы на самом деле не настраиваете адаптер. Вместо этого вы устанавливаете его при извлечении данных json внутри обратных вызовов call.enqueue, эти обратные вызовы вызываются асинхронно, и, таким образом, при первом вызове onCreateView никакой адаптер не устанавливается на RecyclerView. Чтобы избежать этого, установите адаптер с пустым адаптером данных пустым прямо в начале функции onCreateView следующим образом (сделайте newsAdapter переменной текущего фрагмента)

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
newsAdapter = new NewsAdapter(getContext(), articles);
recyclerView.setAdapter(newsAdapter);

сделайте статьи переменными текущего фрагмента и вместо установки и адаптера для обратных вызовов вашей функции Retrive Json просто обновите массив статей данными и вызовите функцию notifydatasetchanged *1005* объекта RecycleView, как это

public void onResponse(Call<Headlines> call, Response<Headlines> response) {
   if (response.isSuccessful() && response.body().getArticles() != null ){
      swipeRefreshLayout.setRefreshing(false);
      articles.clear();
      articles = response.body().getArticles();
      newsAdapter.setData(articles);
      newsAdapter.notifyDataSetChanged()
   }
}

setData это функция, которую вы должны создать в своем классе NewsAdapter. Надеюсь, это помогло! И посмотрите это краткое руководство о том, как использовать RecycleViews

...