2015-09-17 2 views
0

Я хотел бы заполнить RecyclerView в onLoadFinished() с данными курсора, возвращаемыми с CursorLoader. RecyclerView населен, как ожидается, , но я все еще получаю ту же ошибку «Нет адаптер прилагается, пропуская макет»Не прилагается адаптер; пропуская макет при использовании загрузчика курсора

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 

    recyclerViewAdapter = new RecyclerViewAdapter(getApplicationContext(), data); 

    //attach Layout Manager to RecyclerView 
    recyclerView.setLayoutManager(newLinearLayoutManager(getApplicationContext())); 

    //attach adapter to RecyclerView 
    recyclerView.setAdapter(recyclerViewAdapter); 

} 

ответ

1

Наконец после пары дней мне удалось выяснить, что я сделал, чтобы создать экземпляр моего адаптера RecyclerView внутри моего onActivityCreated, передавая только контекст моего фрагмента в конструктор адаптера и устанавливая адаптер для моего RecyclerView

recyclerViewAdapter = new RecyclerViewAdapter(getActivity()); 
recyclerView.setAdapter(recyclerViewAdapter); 

Итак, у RecyclerView Framework есть адаптер, и, таким образом, макет не пропускал. Ара курсор данных, передаваемый (местами) к адаптеру RecyclerView от onLoadFinished() и onLoadReset() методы CursorLoader соответственно

public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    recyclerViewAdapter.swapCursor(data); 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    recyclerViewAdapter.swapCursor(null); 
} 

метод swapCursor был привышным реализован в моем классе RecyclerView адаптера

0

Независимо от того, когда вы подключаете адаптер, ваш RecyclerView собирается необходимости прокладывать себя из на экране, как только содержащая активность/фрагмент должна быть макета, то есть когда экран сначала отображается пользователю.

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

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

+0

по установка пустого адаптера означает создание экземпляра моего класса адаптера с использованием конструктора по умолчанию? – tsiro

+0

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

+0

Я действительно считаю, что ошибка не влияет на общую производительность RecyclerView. – tsiro

0

Это сообщение об ошибке отображается при создании представления. Существует recyclerview, но не адаптер был установлен. Я предлагаю создать и установить адаптер для recyclerview onCreate или inCreateView (если фрагмент). Тогда просто установите курсор или данные адаптера onLoadFinished и уведомляет адаптер для изменения данных ..

или просто игнорировать сообщение об ошибке .. никакого вреда сообщением об ошибке ;-)

+0

Это то, что я собираюсь делать ... просто запустив сообщение об ошибке ... в любом случае спасибо за вашу помощь. – tsiro

+0

Но если ваш recyclerview находится в фрагменте, и вы используете загрузчик, тогда лучше всего создать адаптер в oncreateview с нулевой проверкой перед созданием так что каждый раз, когда вы возобновляете фрагмент, вы можете избежать воссоздания адаптера. Это также будет удерживать состояние адаптера. – Thilek

Смежные вопросы