RecyclerView с ViewModel во фрагменте в Java - PullRequest
1 голос
/ 06 мая 2020

У меня есть проект с RecyclerView MVVM, и я новичок в Android компонентах архитектуры! Теперь я хочу сохранить состояние RecyclerView с помощью ViewModel, но во фрагменте мой код не работает (в Activity работал)

И теперь я показываю только MyFragment и MyViewModel, а остальные прикрепляю ссылку на Tutorial

Учебное пособие https://medium.com/@atifmukhtar / recycler-view-with-mvvm-liveata-a1fd062d2280

My Fargment

public class HomeFragment  extends Fragment implements LifecycleOwner {

    private RecyclerView recyclerView;
    private HomeAdapter homeAdapter;
    private HomeViewModel viewModel;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment_home, container, false);
        this.setHasOptionsMenu(true);
        recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
        //I use code from
        //https://developer.android.com/topic/libraries/architecture/viewmodel
        viewModel.getUserMutableLiveData().observe(getViewLifecycleOwner(), userListUpdateObserver);
        viewModel = new ViewModelProvider(requireActivity()).get(HomeViewModel.class);
        return view;
    }


    private Observer<ArrayList<ProductData>> userListUpdateObserver = new Observer<ArrayList<ProductData>>() {
        @Override
        public void onChanged(ArrayList<ProductData> userArrayList) {
            homeAdapter = new HomeAdapter(requireActivity(),userArrayList);
            recyclerView.setLayoutManager(new LinearLayoutManager(requireActivity()));
            recyclerView.setAdapter(homeAdapter);
        }
    };
}

My ViewModel

public class HomeViewModel extends ViewModel {
    private MutableLiveData<ArrayList<ProductData>> userLiveData;
    private ArrayList<ProductData> userArrayList;
    public HomeViewModel() {
        userLiveData = new MutableLiveData<>();
        init();
    }

    MutableLiveData<ArrayList<ProductData>> getUserMutableLiveData() {
        return userLiveData;
    }

    private void init(){
        populateList();
        userLiveData.setValue(userArrayList);
    }

    private void populateList(){
        ProductData user = new ProductData();
        user.setName("Daylight");
        user.setPrice("Best rating movie");

        userArrayList = new ArrayList<>();
        userArrayList.add(user);
        userArrayList.add(user);
        userArrayList.add(user);
        userArrayList.add(user);
        userArrayList.add(user);
        userArrayList.add(user);
        userArrayList.add(user);
        userArrayList.add(user);
        userArrayList.add(user);
        userArrayList.add(user);
        userArrayList.add(user);
        userArrayList.add(user);
    }
}

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Проблема была в самом Fragment и RecyclerView. Мне удалось решить эту проблему, вызвав setLayoutManager в XML.

В MyFragment я удалил

recyclerView.setLayoutManager(new LinearLayoutManager(requireActivity()));

Я вызываю setLayoutManager в XML

app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
<androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>
0 голосов
/ 06 мая 2020

На вашем HomeFragment вы получаете доступ к viewModel, когда в настоящее время null. Вы должны изменить это:

 viewModel.getUserMutableLiveData().observe(getViewLifecycleOwner(), userListUpdateObserver);
 viewModel = new ViewModelProvider(requireActivity()).get(HomeViewModel.class);

на это:

 viewModel = new ViewModelProvider(requireActivity()).get(HomeViewModel.class);
 viewModel.getUserMutableLiveData().observe(getViewLifecycleOwner(), userListUpdateObserver);

Надеюсь, это вам поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...