ViewModel with LiveData transformations
suggest changepublic class BaseViewModel extends ViewModel { private static final int TAG_SEGMENT_INDEX = 2; private static final int VIDEOS_LIMIT = 100; // We save input params here private final MutableLiveData<Pair<String, String>> urlWithReferrerLiveData = new MutableLiveData<>(); // transform specific uri param to "tag" private final LiveData<String> currentTagLiveData = Transformations.map(urlWithReferrerLiveData, pair -> { Uri uri = Uri.parse(pair.first); List<String> segments = uri.getPathSegments(); if (segments.size() > TAG_SEGMENT_INDEX) return segments.get(TAG_SEGMENT_INDEX); return null; }); // transform "tag" to videos list private final LiveData<List<VideoItem>> videoByTagData = Transformations.switchMap(currentTagLiveData, tag -> contentRepository.getVideoByTag(tag, VIDEOS_LIMIT)); ContentRepository contentRepository; public BaseViewModel() { // some inits } public void setUrlWithReferrer(String url, String referrer) { // set value activates observers and transformations urlWithReferrerLiveData.setValue(new Pair<>(url, referrer)); } public LiveData<List<VideoItem>> getVideoByTagData() { return videoByTagData; } }
Somewhere in UI:
public class VideoActivity extends BaseCompatLifecycleActivity { private VideoViewModel viewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Get ViewModel viewModel = ViewModelProviders.of(this).get(BaseViewModel.class); // Add observer viewModel.getVideoByTagData().observe(this, data -> { // some checks adapter.updateData(data); }); ... if (savedInstanceState == null) { // init loading only at first creation // you just set params and viewModel.setUrlWithReferrer(url, referrer); } }
Found a mistake? Have a question or improvement idea?
Let me know.
Table Of Contents