Ошибка с RecyclerView: No adapter attached; skipping layout

311
14 мая 2017, 22:31

Собственно проблема следующая. Есть активность которая сначала загружает первый фрагмент:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_catalogs);
    initFragments();
}
private void initFragments() {
    CatalogsFragment fragment = new CatalogsFragment();
    fragment.setListener(this);
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.content_frame, fragment);
    transaction.commit();
}

В самом фрагменте я использую RecyclerView

RecyclerView mCatalogsRecyclerView;
MyStorage mStorage;
ArrayList<Catalog> mCatalogs;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_catalogs, container, false);
    mCatalogsRecyclerView = (RecyclerView) view.findViewById(R.id.catalogs_recyclerview);
    mCatalogsRecyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 3));

    mStorage = MyStorage.newInstance(getActivity());
    setupUI();
    return view;
}
private void setupUI() {
    mCatalogs = mStorage.getCatalogs();
    Log.d(TAG, "setupUI() called");
    if (mAdapter == null){
        mAdapter = new CatalogsAdapter(mCatalogs, this);
        mCatalogsRecyclerView.setAdapter(mAdapter);
    } else {
        mAdapter.notifyDataSetChanged();
    }

}

При первой загрузке RecyclerView все хорошо, я повесил слушателя на holder и если пользователь тыкает по view у меня загружается второй фрагмент (это код из активности)

@Override
public void openCatalog(UUID catalogId) {
    ProductsFragment fragment = ProductsFragment.newInstance(catalogId);
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.content_frame, fragment);
    transaction.addToBackStack(null);
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
    transaction.commit();
}

Он нормальльно отрабатывает. Проблема возникает когда я жму кнопку "back". У меня загружается первый фрагмент но при этом RecyclerView пустой и я получаю сообщение в андроидмониторе:

No adapter attached; skipping layout

Собственно что я делаю не так?

Answer 1

Сообщение No adapter attached; skipping layout говорит о том, что для RecyclerView не задан адаптер, то есть RecyclerView не связан ни с какими данными.

Когда Вы возвращаетесь к первому фрагменту, получается такая ситуация, что mAdapter != null и Вы не связываете RecyclerView с данными.

Для решения этой проблемы необходимо строку:

mCatalogsRecyclerView.setAdapter(mAdapter);

вынести из блока if {...} else {...} и сэтить адаптер внезависимости от условия mAdapter == null.

READ ALSO
Какую СУБД выбрать?

Какую СУБД выбрать?

Доброго времени всемНужна помощь по выбору базы данных

222
Вывод данных из массива в таблицу

Вывод данных из массива в таблицу

Как сделать вывод данных в таблицу javafx из массивов ?

208
Как сделать выбор нескольких файлов за раз для загрузки со смартфона через форму

Как сделать выбор нескольких файлов за раз для загрузки со смартфона через форму

Сделал html форму с input multiple, на компе работает выбор нескольких файлов, а на андроиде только по 1 файлу

316