/* * Copyright 2017, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.example.android.persistence; import android.arch.lifecycle.LifecycleFragment; import android.arch.lifecycle.Observer; import android.arch.lifecycle.ViewModelProviders; import android.databinding.DataBindingUtil; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.example.android.persistence.databinding.ProductFragmentBinding; import com.example.android.persistence.db.entity.CommentEntity; import com.example.android.persistence.db.entity.ProductEntity; import com.example.android.persistence.model.Comment; import com.example.android.persistence.ui.CommentAdapter; import com.example.android.persistence.ui.CommentClickCallback; import com.example.android.persistence.viewmodel.ProductViewModel; import java.util.List; public class ProductFragment extends LifecycleFragment { private static final String KEY_PRODUCT_ID = "product_id"; private ProductFragmentBinding mBinding; private CommentAdapter mCommentAdapter; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { // Inflate this data binding layout mBinding = DataBindingUtil.inflate(inflater, R.layout.product_fragment, container, false); // Create and set the adapter for the RecyclerView. mCommentAdapter = new CommentAdapter(mCommentClickCallback); mBinding.commentList.setAdapter(mCommentAdapter); return mBinding.getRoot(); } private final CommentClickCallback mCommentClickCallback = new CommentClickCallback() { @Override public void onClick(Comment comment) { // no-op } }; @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); ProductViewModel.Factory factory = new ProductViewModel.Factory( getActivity().getApplication(), getArguments().getInt(KEY_PRODUCT_ID)); final ProductViewModel model = ViewModelProviders.of(this, factory) .get(ProductViewModel.class); mBinding.setProductViewModel(model); subscribeToModel(model); } private void subscribeToModel(final ProductViewModel model) { // Observe product data model.getObservableProduct().observe(this, new Observer<ProductEntity>() { @Override public void onChanged(@Nullable ProductEntity productEntity) { model.setProduct(productEntity); } }); // Observe comments model.getComments().observe(this, new Observer<List<CommentEntity>>() { @Override public void onChanged(@Nullable List<CommentEntity> commentEntities) { if (commentEntities != null) { mBinding.setIsLoading(false); mCommentAdapter.setCommentList(commentEntities); } else { mBinding.setIsLoading(true); } } }); } /** Creates product fragment for specific product ID */ public static ProductFragment forProduct(int productId) { ProductFragment fragment = new ProductFragment(); Bundle args = new Bundle(); args.putInt(KEY_PRODUCT_ID, productId); fragment.setArguments(args); return fragment; } }