Изначально я создал и использовал RecyclerView внутри своего класса CarActivity. Это работало нормально, извлекало информацию из базы данных и правильно отображало ее в представлении. Затем я изменил класс CarActivity, чтобы вместо этого использовать новый фрагмент под названием AllCarsFragment, и переместил код RecyclerView в новый AllCarsFragment.

CarActivity, похоже, правильно подбирает макет нового фрагмента, однако данные не отображаются, и LogCat показывает следующую ошибку: E/RecyclerView: No adapter attached; skipping layout.

Я пробовал перемещать код между фрагментами методов onCreateView и onViewCreated и возиться с кодом несколькими другими способами, однако я не могу понять, как исправить.

Я также просматривал похожие вопросы на StackOverflow, но я ничего не добился, поэтому приветствую любую помощь.

CarActivity.java

public class CarActivity extends AppCompatActivity {

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

AllCarsFragment.java

public class AllCarsFragment extends Fragment {
    private static final String LOG_TAG = AllCarsFragment.class.getSimpleName();
    private CarViewModel mCarViewModel;

    @Override
    public View onCreateView(
            LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState
    ) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.fragment_all_cars, container, false);

        // Set up the recycler view to display the users saved cars
        RecyclerView recyclerView = view.findViewById(R.id.recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));
        final CarListAdapter adapter = new CarListAdapter(view.getContext());
        recyclerView.setAdapter(adapter);

        mCarViewModel = ViewModelProviders.of(this).get(CarViewModel.class);
        mCarViewModel.getAllCars().observe(getViewLifecycleOwner(), new Observer<List<Car>>() {
            @Override
            public void onChanged(@Nullable final List<Car> cars) {
                // Update the cached copy of the cars in the adapter.
                adapter.setCars(cars);
            }
        });

        return view;
    }

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        // Configure the FAB to redirect the user to add a new car
        FloatingActionButton fab = view.findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.i(LOG_TAG, "Add Car FAB Pressed");
                NavHostFragment.findNavController(AllCarsFragment.this)
                        .navigate(R.id.add_car_dest, null);
            }
        });
    }
}

Пожалуйста, дайте мне знать, если вам понадобится дополнительный код или информация, и я с радостью обновлю вопрос.

1
Diadantic 25 Окт 2020 в 18:02

1 ответ

Лучший ответ

Судя по вашему коду CarActivity, похоже, что вы на самом деле не прикрепляете свой AllCarsFragment к своему CarActivity так, как вы намеревались. Строка setContentView(R.layout.fragment_all_cars) устанавливает файл макета как представление содержимого CarActivity, но это не связывает ваш код в AllCarsFragment с CarActivity. Для этого вам понадобится дополнительный код в CarActivity onCreate(), который выполняет прикрепление. В документации ознакомьтесь с разделом «Добавление фрагмента в действие».

1
CKP78 25 Окт 2020 в 17:19