Адаптер не подключен, ошибка макета пропуска - PullRequest
0 голосов
/ 05 апреля 2019

Привет! Я нашел код в Интернете и пытаюсь его протестировать, но получаю это. Адаптер не подключен, пропуск макета. Ошибка. Я тщетно искал решения.

Вот мой класс MainActivity:

private ArrayList<Employee> employeeList;
private ProgressDialog pDialog;
private RecyclerView recyclerView;
private EmployeesAdapter eAdapter;

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

    pDialog = new ProgressDialog(MainActivity.this);
    pDialog.setMessage("Loading Data.. Please wait...");
    pDialog.setIndeterminate(false);
    pDialog.setCancelable(false);
    pDialog.show();

    //Creating an object of our api interface
    ApiService api = RetroClient.getApiService();

    /**
     * Calling JSON
     */
    Call<EmployeeList> call = api.getMyJSON();

    /**
     * Enqueue Callback will be call when get response...
     */
    call.enqueue(new Callback<EmployeeList>() {
        @Override
        public void onResponse(Call<EmployeeList> call, Response<EmployeeList> response) {
            //Dismiss Dialog
            pDialog.dismiss();

            if (response.isSuccessful()) {
                /**
                 * Got Successfully
                 */
                employeeList = response.body().getEmployee();
                recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
                eAdapter = new EmployeesAdapter(employeeList);
                RecyclerView.LayoutManager eLayoutManager = new LinearLayoutManager(getApplicationContext());
                recyclerView.setLayoutManager(eLayoutManager);
                recyclerView.setItemAnimator(new DefaultItemAnimator());
                recyclerView.setAdapter(eAdapter);
            }
        }

        @Override
        public void onFailure(Call<EmployeeList> call, Throwable t) {
            pDialog.dismiss();
        }
    });
}

Я получаю эту ошибку: E / RecyclerView: адаптер не подключен; пропускающий макет Любые рекомендации?

Ответы [ 3 ]

2 голосов
/ 05 апреля 2019

Ошибка из-за инициализации recycerlview и адаптера из «отложенного» метода. Чтобы решить эту проблему, сделайте, как показано ниже:

Сначала запустите ваш arraylist, как показано ниже:

private ArrayList<Employee> employeeList = new ArrayList<>();

Инициализируйте свой просмотрщик перед вызовом API, значит в главном потоке:

recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
eAdapter = new EmployeesAdapter(employeeList);
RecyclerView.LayoutManager eLayoutManager = new LinearLayoutManager(MainActivity.this);
recyclerView.setLayoutManager(eLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(eAdapter);

Тогда в своем ответе API вы должны обновлять адаптер, только если найден список:

if(response != null && response.body() != null && response.body().getEmployee() != null){
      employeeList.clear();
      employeeList.addAll(response.body().getEmployee());
      if(eAdapter != null){
           eAdapter.notifyDataSetChanged();
      }
}
1 голос
/ 05 апреля 2019

Сообщение об ошибке ясно.

вы не установили адаптер для вашего recyclerView при создании Activity. Можете ли вы думать, что вы установили адаптер для recyclerView в методе onCreate, но запущены два потока, один из которых является основным потоком, а другой поток - это поток, который вы установили для своего recylerView. Это означает, что поток, который вы устанавливаете адаптер для recylerView, может блокировать получение данных из сети, когда recylerView необходимо подключить адаптер.

Вы можете исправить эту проблему следующим кодом!

    private final ArrayList<Employee> employeeList = new ArrayList<>();
    private ProgressDialog pDialog;
    private RecyclerView recyclerView;
    private EmployeesAdapter eAdapter;

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


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        eAdapter = new EmployeesAdapter(employeeList);
        RecyclerView.LayoutManager eLayoutManager = new LinearLayoutManager(getApplicationContext());
        recyclerView.setLayoutManager(eLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(eAdapter);

        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Loading Data.. Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();

        //Creating an object of our api interface
        ApiService api = RetroClient.getApiService();

        /**
         * Calling JSON
         */
        Call<EmployeeList> call = api.getMyJSON();

        /**
         * Enqueue Callback will be call when get response...
         */
        call.enqueue(new Callback<EmployeeList>() {
            @Override
            public void onResponse(Call<EmployeeList> call, Response<EmployeeList> response) {
                //Dismiss Dialog
                pDialog.dismiss();

                if (response.isSuccessful()) {
                    /**
                     * Got Successfully
                     */

                    employeeList.clear();
                    employeeList.addAll(response.body().getEmployee());
                    eAdapter.notifyDataSetChanged();

                }
            }

            @Override
            public void onFailure(Call<EmployeeList> call, Throwable t) {
                pDialog.dismiss();
            }
        });
    }
1 голос
/ 05 апреля 2019

Всегда пытайтесь инициализировать объекты, необходимые классы, адаптеры, такие как LinearLayoutManager, прежде чем вызывать фоновую задачу.возможно, это создает проблему в вашем случае.

Я внес некоторые изменения в ваш код:

private ArrayList<Employee> employeeList;
private ProgressDialog pDialog;
private RecyclerView recyclerView;
private EmployeesAdapter eAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   employeeList = new ArrayList<>;
   recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
   eAdapter = new EmployeesAdapter(employeeList);
   RecyclerView.LayoutManager eLayoutManager = new 
         LinearLayoutManager(getApplicationContext());
   recyclerView.setLayoutManager(eLayoutManager);
   recyclerView.setItemAnimator(new DefaultItemAnimator());
   recyclerView.setAdapter(eAdapter);

pDialog = new ProgressDialog(MainActivity.this);
pDialog.setMessage("Loading Data.. Please wait...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();

//Creating an object of our api interface
ApiService api = RetroClient.getApiService();

/**
 * Calling JSON
 */
Call<EmployeeList> call = api.getMyJSON();

/**
 * Enqueue Callback will be call when get response...
 */
call.enqueue(new Callback<EmployeeList>() {
    @Override
    public void onResponse(Call<EmployeeList> call, Response<EmployeeList> response) {
        //Dismiss Dialog
        pDialog.dismiss();

        if (response.isSuccessful()) {
            /**
             * Got Successfully
             */
             if(!employeeList.isEmpty())employeeList.clear();
            employeeList.addAll(response.body().getEmployee());
            eAdapter.notifyDataSetChanged();
        }
    }

    @Override
    public void onFailure(Call<EmployeeList> call, Throwable t) {
        pDialog.dismiss();
    }
});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...