Add list food recycle view

This commit is contained in:
Nezumi
2023-02-13 19:15:09 +07:00
parent bbf7dfd68b
commit 8b010e9709
15 changed files with 435 additions and 66 deletions
+2
View File
@@ -49,4 +49,6 @@ dependencies {
implementation 'com.github.smarteist:autoimageslider:1.4.0'
implementation 'com.github.bumptech.glide:glide:4.14.2'
annotationProcessor 'com.github.bumptech.glide:compiler:4.14.2'
implementation 'com.squareup.picasso:picasso:2.8'
}
@@ -1,6 +1,6 @@
package com.capstone.foodify.API;
import com.capstone.foodify.DistrictWardResponse.DisctrictWardResponse;
import com.capstone.foodify.Model.DistrictWard.DisctrictWardResponse;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
@@ -11,14 +11,14 @@ import retrofit2.http.GET;
import retrofit2.http.Query;
public interface ApiService {
public interface DistrictWardApi {
Gson gson = new GsonBuilder().setDateFormat("HH:mm:ss dd-MM-yyyy").create();
ApiService apiService = new Retrofit.Builder()
DistrictWardApi apiService = new Retrofit.Builder()
.baseUrl("https://vn-public-apis.fpo.vn/").addConverterFactory(GsonConverterFactory.create(gson))
.build()
.create(ApiService.class);
.create(DistrictWardApi.class);
@GET("wards/getByDistrict")
Call<DisctrictWardResponse> wardResponse(@Query("districtCode") int districtCode, @Query("limit") int limit);
@@ -0,0 +1,29 @@
package com.capstone.foodify.API;
import com.capstone.foodify.Model.Food.Food;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.util.List;
import retrofit2.Call;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.GET;
public interface FoodApi {
Gson gson = new GsonBuilder().setDateFormat("HH:mm:ss dd-MM-yyyy").create();
FoodApi apiService = new Retrofit.Builder()
.baseUrl("https://free-food-menus-api-production.up.railway.app/").addConverterFactory(GsonConverterFactory.create(gson))
.build()
.create(FoodApi.class);
@GET("best-foods")
Call<List<Food>> bestFoodResponse();
@GET("drinks")
Call<List<Food>> drinksFoodResponse();
}
@@ -18,9 +18,9 @@ import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.capstone.foodify.API.ApiService;
import com.capstone.foodify.DistrictWardResponse.Datas;
import com.capstone.foodify.DistrictWardResponse.DisctrictWardResponse;
import com.capstone.foodify.API.DistrictWardApi;
import com.capstone.foodify.Model.DistrictWard.Datas;
import com.capstone.foodify.Model.DistrictWard.DisctrictWardResponse;
import com.capstone.foodify.R;
import com.google.android.material.textfield.TextInputLayout;
@@ -134,7 +134,7 @@ public class SignUpActivity extends AppCompatActivity {
districtList.add("---Quận");
ApiService.apiService.districtResponse(PROVINCE_CODE, LIMIT).enqueue(new Callback<DisctrictWardResponse>() {
DistrictWardApi.apiService.districtResponse(PROVINCE_CODE, LIMIT).enqueue(new Callback<DisctrictWardResponse>() {
@Override
public void onResponse(Call<DisctrictWardResponse> call, Response<DisctrictWardResponse> response) {
DisctrictWardResponse districtResponse = response.body();
@@ -165,7 +165,7 @@ public class SignUpActivity extends AppCompatActivity {
wardList.add("---Phường");
if(districtCode != 0){
ApiService.apiService.wardResponse(districtCode, LIMIT).enqueue(new Callback<DisctrictWardResponse>() {
DistrictWardApi.apiService.wardResponse(districtCode, LIMIT).enqueue(new Callback<DisctrictWardResponse>() {
@Override
public void onResponse(Call<DisctrictWardResponse> call, Response<DisctrictWardResponse> response) {
@@ -4,9 +4,16 @@ import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.capstone.foodify.API.FoodApi;
import com.capstone.foodify.Model.Food.Food;
import com.capstone.foodify.Model.Menu.Menu;
import com.capstone.foodify.Model.Menu.MenuAdapter;
import com.capstone.foodify.R;
import com.denzcoskun.imageslider.ImageSlider;
import com.denzcoskun.imageslider.constants.ScaleTypes;
@@ -14,19 +21,40 @@ import com.denzcoskun.imageslider.models.SlideModel;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class HomeFragment extends Fragment {
ImageSlider imageSlider;
private static List<Food> listFood = new ArrayList<>();
private static List<Food> drinkFood = new ArrayList<>();
private ImageSlider imageSlider;
private RecyclerView rcvMenu;
private MenuAdapter menuAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
//Init Component
imageSlider = (ImageSlider) view.findViewById(R.id.slider);
rcvMenu = view.findViewById(R.id.recycler_view_menu);
menuAdapter = new MenuAdapter(getContext());
getListFood();
drinkListFood();
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext(), RecyclerView.VERTICAL, false);
rcvMenu.setLayoutManager(linearLayoutManager);
List<SlideModel> slideModels = new ArrayList<>();
slideModels.add(new SlideModel("https://res.cloudinary.com/dnkmxpujh/image/upload/v1676023773/banner1_dandvd.png", null));
slideModels.add(new SlideModel("https://res.cloudinary.com/dnkmxpujh/image/upload/v1676023777/banner2_okkqac.png", null));
slideModels.add(new SlideModel("https://res.cloudinary.com/dnkmxpujh/image/upload/v1676023775/banner3_rklfi6.png", null));
@@ -34,7 +62,59 @@ public class HomeFragment extends Fragment {
slideModels.add(new SlideModel("https://res.cloudinary.com/dnkmxpujh/image/upload/v1676023778/banner5_b4d1b8.png", null));
imageSlider.setImageList(slideModels, ScaleTypes.FIT);
// Inflate the layout for this fragment
return view;
}
private List<Menu> getListMenu() {
List<Menu> listMenu = new ArrayList<>();
listMenu.add(new Menu("Recommend Food", listFood));
listMenu.add(new Menu("Drinks", drinkFood));
return listMenu;
}
private void getListFood() {
FoodApi.apiService.bestFoodResponse().enqueue(new Callback<List<Food>>() {
@Override
public void onResponse(Call<List<Food>> call, Response<List<Food>> response) {
List<Food> foodData = response.body();
for(Food tempFood: foodData){
listFood.add(tempFood);
}
drinkListFood();
}
@Override
public void onFailure(Call<List<Food>> call, Throwable t) {
Toast.makeText(getContext(), "Lỗi" + t, Toast.LENGTH_LONG).show();
}
});
}
private void drinkListFood() {
FoodApi.apiService.drinksFoodResponse().enqueue(new Callback<List<Food>>() {
@Override
public void onResponse(Call<List<Food>> call, Response<List<Food>> response) {
List<Food> foodData = response.body();
for(Food tempFood: foodData){
drinkFood.add(tempFood);
}
menuAdapter.setData(getListMenu());
rcvMenu.setAdapter(menuAdapter);
}
@Override
public void onFailure(Call<List<Food>> call, Throwable t) {
Toast.makeText(getContext(), "Lỗi" + t, Toast.LENGTH_LONG).show();
}
});
}
}
@@ -1,4 +1,4 @@
package com.capstone.foodify.DistrictWardResponse;
package com.capstone.foodify.Model.DistrictWard;
import java.util.List;
@@ -1,4 +1,4 @@
package com.capstone.foodify.DistrictWardResponse;
package com.capstone.foodify.Model.DistrictWard;
public class Datas {
private String _id;
@@ -1,4 +1,4 @@
package com.capstone.foodify.DistrictWardResponse;
package com.capstone.foodify.Model.DistrictWard;
public class DisctrictWardResponse {
private int exitcode;
@@ -0,0 +1,80 @@
package com.capstone.foodify.Model.Food;
public class Food {
private String id;
private String img;
private String name;
private String dsc;
private String price;
private String rate;
private String country;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getImg() {
return img;
}
public void setImg(String img) {
this.img = img;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDsc() {
return dsc;
}
public void setDsc(String dsc) {
this.dsc = dsc;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getRate() {
return rate;
}
public void setRate(String rate) {
this.rate = rate;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Override
public String toString() {
return "Food{" +
"id='" + id + '\'' +
", img='" + img + '\'' +
", name='" + name + '\'' +
", dsc='" + dsc + '\'' +
", price='" + price + '\'' +
", rate='" + rate + '\'' +
", country='" + country + '\'' +
'}';
}
}
@@ -0,0 +1,75 @@
package com.capstone.foodify.Model.Food;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.capstone.foodify.R;
import com.squareup.picasso.Picasso;
import java.util.List;
public class FoodAdapter extends RecyclerView.Adapter<FoodAdapter.FoodViewHolder>{
private List<Food> listFood;
public void setData(List<Food> list) {
this.listFood = list;
notifyDataSetChanged();
}
@NonNull
@Override
public FoodViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_foods, parent, false);
return new FoodViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull FoodViewHolder holder, int position) {
Food food = listFood.get(position);
if(food == null){
return;
}
String foodName = food.getName();
if(foodName.length() >= 19){
StringBuilder stringBuilder = new StringBuilder(food.getName());
stringBuilder.replace(19, food.getName().length(), "..." );
holder.name.setText(stringBuilder);
} else {
holder.name.setText(foodName);
}
Picasso.get().load(food.getImg()).into(holder.image);
holder.price.setText(food.getPrice());
}
@Override
public int getItemCount() {
if(listFood != null) {
return listFood.size();
}
return 0;
}
public class FoodViewHolder extends RecyclerView.ViewHolder{
private ImageView image;
private TextView name, price;
public FoodViewHolder(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.image_view);
name = itemView.findViewById(R.id.title);
price = itemView.findViewById(R.id.price);
}
}
}
@@ -0,0 +1,32 @@
package com.capstone.foodify.Model.Menu;
import com.capstone.foodify.Model.Food.Food;
import java.util.List;
public class Menu {
private String nameMenu;
private List<Food> foods;
public Menu(String nameMenu, List<Food> foods) {
this.nameMenu = nameMenu;
this.foods = foods;
}
public String getNameMenu() {
return nameMenu;
}
public void setNameMenu(String nameMenu) {
this.nameMenu = nameMenu;
}
public List<Food> getFoods() {
return foods;
}
public void setFoods(List<Food> foods) {
this.foods = foods;
}
}
@@ -0,0 +1,78 @@
package com.capstone.foodify.Model.Menu;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.capstone.foodify.Model.Food.FoodAdapter;
import com.capstone.foodify.R;
import java.util.List;
public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.MenuViewHolder>{
private Context context;
private List<Menu> listMenu;
public MenuAdapter(Context context) {
this.context = context;
}
public void setData(List<Menu> list){
this.listMenu = list;
notifyDataSetChanged();
}
@NonNull
@Override
public MenuViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.menu, parent, false);
return new MenuViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MenuViewHolder holder, int position) {
Menu menu = listMenu.get(position);
if(menu == null){
return;
}
holder.titleMenu.setText(menu.getNameMenu());
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context, RecyclerView.HORIZONTAL, false);
holder.rcvFood.setLayoutManager(linearLayoutManager);
FoodAdapter foodAdapter = new FoodAdapter();
foodAdapter.setData(menu.getFoods());
holder.rcvFood.setAdapter(foodAdapter);
}
@Override
public int getItemCount() {
if(listMenu != null){
return listMenu.size();
}
return 0;
}
public class MenuViewHolder extends RecyclerView.ViewHolder{
private TextView titleMenu;
private RecyclerView rcvFood;
public MenuViewHolder(@NonNull View itemView) {
super(itemView);
titleMenu = itemView.findViewById(R.id.menuTitle);
rcvFood = itemView.findViewById(R.id.recycler_view_food);
}
}
}
+4 -48
View File
@@ -71,32 +71,17 @@
app:layout_constraintEnd_toEndOf="parent"
/>
<TextView
android:id="@+id/recommend_text"
android:text="@string/recommend_for_you"
android:layout_marginTop="5dp"
android:textColor="@color/black"
android:textStyle="bold"
android:layout_marginStart="20dp"
android:textSize="18sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/slider"
app:layout_constraintStart_toStartOf="parent"
/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_food"
android:id="@+id/recycler_view_menu"
android:layout_width="0dp"
android:layout_height="251dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="20dp"
android:layout_marginTop="10dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:orientation="horizontal"
tools:listitem="@layout/list_foods"
app:layout_constraintTop_toBottomOf="@id/recommend_text"
app:layout_constraintTop_toBottomOf="@id/slider"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
/>
@@ -111,7 +96,7 @@
android:textSize="18sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/recycler_view_food"
app:layout_constraintTop_toBottomOf="@id/recycler_view_menu"
app:layout_constraintStart_toStartOf="parent"
/>
@@ -131,35 +116,6 @@
app:layout_constraintEnd_toEndOf="parent"
/>
<TextView
android:id="@+id/the_most_popular_food_text"
android:text="@string/the_most_popular_food"
android:layout_marginTop="5dp"
android:textColor="@color/black"
android:textStyle="bold"
android:layout_marginStart="20dp"
android:textSize="18sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/recycler_view_restaurant"
app:layout_constraintStart_toStartOf="parent"
/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_food_most_popular"
android:layout_width="0dp"
android:layout_height="251dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="20dp"
android:layout_marginTop="10dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:orientation="horizontal"
tools:listitem="@layout/list_foods"
app:layout_constraintTop_toBottomOf="@id/the_most_popular_food_text"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.core.widget.NestedScrollView>
+7 -4
View File
@@ -2,7 +2,10 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="157dp"
android:layout_height="match_parent"
android:layout_margin="10dp"
android:layout_marginStart="0dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:layout_marginEnd="10dp"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.cardview.widget.CardView
@@ -41,10 +44,10 @@
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_height="22dp"
android:text="Food Title"
android:layout_marginStart="6dp"
android:textSize="16sp"
android:textSize="12sp"
android:fontFamily="@font/opensans"
android:textColor="@color/black"
android:layout_marginTop="5dp"
@@ -64,7 +67,7 @@
>
<TextView
android:id="@+id/price_textview"
android:id="@+id/price"
android:text="$ 5.00"
android:textSize="20sp"
android:textColor="@color/primaryColor"
+34
View File
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<TextView
android:id="@+id/menuTitle"
android:text="Title Menu"
android:textSize="25dp"
android:fontFamily="@font/opensans"
android:textColor="@color/black"
android:textStyle="bold"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_food"
android:layout_width="0dp"
android:layout_height="251dp"
android:layout_marginTop="10dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:orientation="horizontal"
tools:listitem="@layout/list_foods"
app:layout_constraintTop_toBottomOf="@id/menuTitle"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>