Адаптер не подключен, ошибка пропуска макета

#android #json #retrofit

#Android #json #модернизация

Вопрос:

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

Вот мой класс 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: адаптер не подключен; пропуск макета
Какие-либо рекомендации?

Комментарии:

1. это будет первое сообщение, когда адаптер не подключен при раздувании макета (и, следовательно, синхронном просмотре recyclerview). Затем вы получаете свои данные, и данные отображаются.

2. инициализируйте свой адаптер вне вызова API с пустым списком. И внутри вызова API обновите адаптер с обновленным списком. В основном эта ошибка возникает при задержке настройки адаптера.

3. recyclerView = (RecyclerView) findViewById(R.id.recycler_view); не должен вызываться в вашем ответе, и вы должны инициализировать список в oncreate

Ответ №1:

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

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

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

Инициализируйте свой recyclerview перед вызовом 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 amp;amp; response.body() != null amp;amp; response.body().getEmployee() != null){
      employeeList.clear();
      employeeList.addAll(response.body().getEmployee());
      if(eAdapter != null){
           eAdapter.notifyDataSetChanged();
      }
}
  

Комментарии:

1. куда я должен это добавить, пожалуйста?

2. запустите ваш recyclerview и адаптер сразу после вашего метода «setContentView», как я указал выше. В вашем LinearLayoutManager также замените getApplicationContext() на «MainActivity.this»

3. и if(response!=null amp;amp; reposnse.body() …..) ? Куда мне его положить , пожалуйста ?

4. в вашем ответе api, но в пределах условия if «if (response.isSuccessful()) {«. Также в вашем LinearLayoutManager также замените getApplicationContext() на «MainActivity.this»

Ответ №2:

Сообщение об ошибке понятно.

вы не установили адаптер для вашего RecyclerView при создании Activity. Можете ли вы подумать, что вы установили адаптер для RecyclerView в методе onCreate , но запущено два потока, один — основной поток, другой поток — это поток, в котором вы установили адаптер для вашего RecyclerView. Это означает, что поток, в котором вы установили адаптер для 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. отображается следующая ошибка: java.lang. Исключение NullPointerException: попытка вызвать метод интерфейса ‘int java.util.List.size()’ для ссылки на нулевой объект в com.example.retrofit.EmployeesAdapter.getItemCount(EmployeesAdapter.java:44)

2. @Yassineelbaj я отредактировал свой ответ, пожалуйста, попробуйте еще раз.

Ответ №3:

Всегда старайтесь сначала инициализировать объекты, требуемые классы, адаптеры, такие как 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();
    }
});
}
  

Комментарии:

1. метод .notifyDataSetChanged() не распознан

2. пожалуйста, добавьте eAdapter.notifyDataSetChanged(); вместо eAdapter.notifyDataSetChanged();

3. программа запускается с 0 ошибками, но список пуст и много предупреждений

4. можете ли вы указать, какой тип предупреждения вы получаете?

5. W / art: Сбой execv(/system/bin/dex2oat —runtime-arg -classpath —runtime-arg —отлаживаемый —набор инструкций = arm —набор инструкций=функции = smp, div, atomic_ldrd_strd —runtime-arg -Xrelocate —загрузочный образ=/system/framework/boot.art —runtime-arg -Xms64m —runtime-arg -Xmx512m —вариант набора инструкций = скачатьkrait —набор инструкций-функции = по умолчанию —dex-file=/data/app/com.example.retrofit-2/split_lib_slice_4_apk.apk —oat-file=/data/dalvik-cache/arm/data@app@com.example.retrofit-2@split_lib_slice_4_apk.apk@classes.dex ) поскольку статус выхода не равен 0, таких 6