#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