From 03a96c5567028170b2464612304dd0e9a46d4ec3 Mon Sep 17 00:00:00 2001 From: Sabrina Li Date: Tue, 10 Mar 2020 14:07:46 -0400 Subject: [PATCH 1/2] add recyclerViewAdapter and poputate recycler view --- .../adapters/MarketProductAdapter.java | 77 +++++++++++++++++++ .../shoppedemo/ui/market/MarketFragment.java | 11 ++- .../src/main/res/layout/fragment_market.xml | 4 +- 3 files changed, 89 insertions(+), 3 deletions(-) create mode 100644 java/app/src/main/java/com/fullstorydev/shoppedemo/adapters/MarketProductAdapter.java diff --git a/java/app/src/main/java/com/fullstorydev/shoppedemo/adapters/MarketProductAdapter.java b/java/app/src/main/java/com/fullstorydev/shoppedemo/adapters/MarketProductAdapter.java new file mode 100644 index 0000000..d478071 --- /dev/null +++ b/java/app/src/main/java/com/fullstorydev/shoppedemo/adapters/MarketProductAdapter.java @@ -0,0 +1,77 @@ +package com.fullstorydev.shoppedemo.adapters; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.databinding.DataBindingUtil; +import androidx.recyclerview.widget.RecyclerView; + +import com.fullstorydev.shoppedemo.R; +import com.fullstorydev.shoppedemo.data.Product; +import com.fullstorydev.shoppedemo.databinding.ListItemMarketBinding; + +import java.util.ArrayList; +import java.util.List; + +public class MarketProductAdapter extends RecyclerView.Adapter { + private List mProductList; + private LayoutInflater layoutInflater; + + public MarketProductAdapter() { + mProductList = new ArrayList<>(); + } + + @NonNull + @Override + public MarketProductViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + if (layoutInflater == null) { + layoutInflater = LayoutInflater.from(parent.getContext()); + } + // binding class automatically generated by Data Binding Library from list_item_market + ListItemMarketBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item_market, parent, false); + return new MarketProductViewHolder(binding); + } + + @Override + public void onBindViewHolder(@NonNull MarketProductViewHolder holder, int position) { + holder.bind(mProductList.get(position)); + } + + @Override + public int getItemCount() { + if(mProductList==null) return 0; + return mProductList.size(); + } + + public void setProductList(List products){ + //TODO: check diff and use callback & DiffUtil.DiffResult to avoid recreating every view + mProductList = products; + notifyDataSetChanged(); + } + + class MarketProductViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + private ListItemMarketBinding binding; + protected MarketProductViewHolder(@NonNull ListItemMarketBinding binding){ + super(binding.getRoot()); + this.binding = binding; + } + + void bind(Product product) { + binding.setProduct(product); + binding.executePendingBindings(); + } + + @Override + public void onClick(View v) { + // getting clicked product from adapter position + Product product = mProductList.get(getAdapterPosition()); + try { + //TODO: When recyclerview is clicked, get the product and perform action here, i.e. show product details fragment + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} \ No newline at end of file diff --git a/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketFragment.java b/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketFragment.java index 75d8c36..10a11ba 100644 --- a/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketFragment.java +++ b/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketFragment.java @@ -9,21 +9,29 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.RecyclerView; import com.fullstorydev.shoppedemo.R; +import com.fullstorydev.shoppedemo.adapters.MarketProductAdapter; import com.fullstorydev.shoppedemo.data.Product; +import com.fullstorydev.shoppedemo.databinding.ListItemMarketBinding; import java.util.List; public class MarketFragment extends Fragment { private MarketViewModel marketViewModel; + private MarketProductAdapter mMarketProductAdapter; @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_market, container, false); + mMarketProductAdapter = new MarketProductAdapter(); + RecyclerView mRecyclerView = root.findViewById(R.id.rv_product); + mRecyclerView.setAdapter(mMarketProductAdapter); + return root; } @@ -32,11 +40,10 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); marketViewModel = new ViewModelProvider(this).get(MarketViewModel.class); - marketViewModel.getProductList().observe(this.getViewLifecycleOwner(), new Observer>() { @Override public void onChanged(List products) { - // products holds the list of products, live data is updated when retrieved from API, this data will be used to populate the recycler view + mMarketProductAdapter.setProductList(products); } }); } diff --git a/java/app/src/main/res/layout/fragment_market.xml b/java/app/src/main/res/layout/fragment_market.xml index dac5af5..b3eb364 100644 --- a/java/app/src/main/res/layout/fragment_market.xml +++ b/java/app/src/main/res/layout/fragment_market.xml @@ -1,5 +1,6 @@ @@ -7,5 +8,6 @@ + android:id="@+id/rv_product" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> \ No newline at end of file From 3878d8e9c3881daa251d7cc16515578d0be07209 Mon Sep 17 00:00:00 2001 From: Sabrina Li Date: Tue, 10 Mar 2020 17:39:41 -0400 Subject: [PATCH 2/2] add binding for onclick listener --- .../shoppedemo/adapters/MarketProductAdapter.java | 9 +++++++-- .../shoppedemo/ui/market/MarketEventHandlers.java | 8 ++++++++ .../shoppedemo/ui/market/MarketFragment.java | 9 ++++++--- .../shoppedemo/ui/market/MarketViewModel.java | 6 ++++-- java/app/src/main/res/layout/list_item_market.xml | 4 ++++ 5 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketEventHandlers.java diff --git a/java/app/src/main/java/com/fullstorydev/shoppedemo/adapters/MarketProductAdapter.java b/java/app/src/main/java/com/fullstorydev/shoppedemo/adapters/MarketProductAdapter.java index d478071..24d0e51 100644 --- a/java/app/src/main/java/com/fullstorydev/shoppedemo/adapters/MarketProductAdapter.java +++ b/java/app/src/main/java/com/fullstorydev/shoppedemo/adapters/MarketProductAdapter.java @@ -8,6 +8,7 @@ import androidx.databinding.DataBindingUtil; import androidx.recyclerview.widget.RecyclerView; +import com.fullstorydev.shoppedemo.ui.market.MarketEventHandlers; import com.fullstorydev.shoppedemo.R; import com.fullstorydev.shoppedemo.data.Product; import com.fullstorydev.shoppedemo.databinding.ListItemMarketBinding; @@ -18,8 +19,10 @@ public class MarketProductAdapter extends RecyclerView.Adapter { private List mProductList; private LayoutInflater layoutInflater; + private MarketEventHandlers mMarketHandlers; - public MarketProductAdapter() { + public MarketProductAdapter(MarketEventHandlers marketHandlers) { + mMarketHandlers = marketHandlers; mProductList = new ArrayList<>(); } @@ -53,9 +56,11 @@ public void setProductList(List products){ class MarketProductViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { private ListItemMarketBinding binding; - protected MarketProductViewHolder(@NonNull ListItemMarketBinding binding){ + MarketProductViewHolder(@NonNull ListItemMarketBinding binding){ super(binding.getRoot()); this.binding = binding; + // bind the on click handler for add to cart buttons + this.binding.setHandlers(mMarketHandlers); } void bind(Product product) { diff --git a/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketEventHandlers.java b/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketEventHandlers.java new file mode 100644 index 0000000..1193ae5 --- /dev/null +++ b/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketEventHandlers.java @@ -0,0 +1,8 @@ +package com.fullstorydev.shoppedemo.ui.market; + +import com.fullstorydev.shoppedemo.data.Product; + +// interface for all action handlers for the market fragment +public interface MarketEventHandlers { + void onClickAddToCart(Product product); +} diff --git a/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketFragment.java b/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketFragment.java index 10a11ba..064e94f 100644 --- a/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketFragment.java +++ b/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketFragment.java @@ -14,11 +14,10 @@ import com.fullstorydev.shoppedemo.R; import com.fullstorydev.shoppedemo.adapters.MarketProductAdapter; import com.fullstorydev.shoppedemo.data.Product; -import com.fullstorydev.shoppedemo.databinding.ListItemMarketBinding; import java.util.List; -public class MarketFragment extends Fragment { +public class MarketFragment extends Fragment implements MarketEventHandlers { private MarketViewModel marketViewModel; private MarketProductAdapter mMarketProductAdapter; @@ -28,7 +27,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_market, container, false); - mMarketProductAdapter = new MarketProductAdapter(); + mMarketProductAdapter = new MarketProductAdapter(this); RecyclerView mRecyclerView = root.findViewById(R.id.rv_product); mRecyclerView.setAdapter(mMarketProductAdapter); @@ -47,4 +46,8 @@ public void onChanged(List products) { } }); } + + public void onClickAddToCart(Product product){ + marketViewModel.increaseQuantityInCart(product); + } } \ No newline at end of file diff --git a/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketViewModel.java b/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketViewModel.java index de9c254..e0c5439 100644 --- a/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketViewModel.java +++ b/java/app/src/main/java/com/fullstorydev/shoppedemo/ui/market/MarketViewModel.java @@ -14,10 +14,8 @@ public class MarketViewModel extends AndroidViewModel { private ProductRepository mRepository; private LiveData> mProductList; - public MarketViewModel(Application application) { super(application); - mRepository = new ProductRepository(application); mProductList = mRepository.getAllFromAPI(); } @@ -25,4 +23,8 @@ public MarketViewModel(Application application) { public LiveData> getProductList() { return mProductList; } + + public void increaseQuantityInCart(Product product){ + mRepository.increaseQuantityInCart(product); + } } \ No newline at end of file diff --git a/java/app/src/main/res/layout/list_item_market.xml b/java/app/src/main/res/layout/list_item_market.xml index 5b907fd..adc108e 100644 --- a/java/app/src/main/res/layout/list_item_market.xml +++ b/java/app/src/main/res/layout/list_item_market.xml @@ -6,6 +6,9 @@ +