2

I am seeing my Viewmodel getting created every time I do an orientation change. I always thought the ViewModelProviders would give me back the same instance of the on config changes. I initalize my view model in onActivityCreated . I am using a navigation component with a single activity architecture . Where I use the nav host fragment in my activity. This is my home fragment.

public class EmployeeDirectoryFragment extends Fragment implements 
EmployeeDirectoryAdapter.ProfilePictureClickListener {
private EmployeeDirectoryViewModel employeeDirectoryViewModel;
private EmployeeDirectoryFragmentBinding employeeDirectoryFragmentBinding;
private EmployeeDirectoryAdapter employeeDirectoryAdapter;
private List<Employee> employees = new ArrayList<>();

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
    employeeDirectoryFragmentBinding = DataBindingUtil.inflate(inflater, R.layout.employee_directory_fragment, container, false);
    return employeeDirectoryFragmentBinding.getRoot();
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    employeeDirectoryViewModel = ViewModelProviders.of(this).get(EmployeeDirectoryViewModel.class);
    employeeDirectoryFragmentBinding.directoryView.setLayoutManager(new LinearLayoutManager(getContext()));
    employeeDirectoryAdapter = new EmployeeDirectoryAdapter(employees, this);
    employeeDirectoryFragmentBinding.directoryView.setAdapter(employeeDirectoryAdapter);

    employeeDirectoryFragmentBinding.setEmployeeViewModel(employeeDirectoryViewModel);
    employeeDirectoryFragmentBinding.setLifecycleOwner(this);
    employeeDirectoryViewModel.getEmployees().observe(this, new Observer<List<Employee>>() {
        @Override
        public void onChanged(List<Employee> updatedEmployees) {
            employees.addAll(updatedEmployees);
            employeeDirectoryAdapter.notifyDataSetChanged();
        }
    });

    employeeDirectoryViewModel.hasError().observe(this, new Observer<Boolean>() {
        @Override
        public void onChanged(Boolean hasError) {
            employeeDirectoryFragmentBinding.directoryView.setVisibility(hasError ? View.GONE : View.VISIBLE);
            employeeDirectoryFragmentBinding.emptyView.setVisibility(hasError ? View.VISIBLE : View.GONE);
        }
    });
}

@Override
public void onProfilePictureClick(String url) {
    Navigation.findNavController(getView()).navigate(EmployeeDirectoryFragmentDirections.actionEmployeeDirectoryFragmentToProfileFragment2(url));
}
}
Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
luckysing_noobster
  • 1,933
  • 5
  • 24
  • 50
  • 1
    How did you figure out that it is not restoring its instance? – Taseer Oct 27 '19 at 08:37
  • 1
    Do you mean to say that when you change orientation, recyclerview is recreated/refreshed and scrolls to the top of list again? – Zohaib Amir Oct 27 '19 at 09:29
  • I was seeing the recycler-view getting populated again and kept adding more items to the collection. I thought the viewmodel was getting recreated I debugged and saw I was retaining the same instance the fact is that the the fragment gets recreated with the last observed state being restored from the viewmodel was something new to me – luckysing_noobster Oct 27 '19 at 19:42

0 Answers0