diff --git a/app/build.gradle.kts b/app/build.gradle.kts index eb81936..3fe22b7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -53,4 +53,8 @@ dependencies { // Glide или Picasso для загрузки картинок из БД или интернета implementation ("com.github.bumptech.glide:glide:4.13.2") kapt ("com.github.bumptech.glide:compiler:4.13.2") + implementation("androidx.viewpager2:viewpager2:1.1.0") + implementation ("com.google.android.material:material:1.8.0") + implementation ("io.coil-kt:coil:2.2.2") // или Glide для картинок + implementation ("androidx.lifecycle:lifecycle-livedata-ktx:2.6.1") } diff --git a/app/src/main/java/com/example/projectfigma/Activity/HomeActivity.kt b/app/src/main/java/com/example/projectfigma/Activity/HomeActivity.kt index a4402ce..f75dc4a 100644 --- a/app/src/main/java/com/example/projectfigma/Activity/HomeActivity.kt +++ b/app/src/main/java/com/example/projectfigma/Activity/HomeActivity.kt @@ -43,14 +43,13 @@ class HomeActivity : AppCompatActivity(), user = userDao.getUserByEmail(email) } - val items: List = dao.getAll() - findViewById(R.id.rvBestSellers).apply { + val rv = findViewById(R.id.rvBestSellers).apply { layoutManager = LinearLayoutManager( this@HomeActivity, LinearLayoutManager.HORIZONTAL, false ) - adapter = BestSellerAdapter(items) { item -> + adapter = BestSellerAdapter(emptyList()) { item: BestSeller -> Toast.makeText( this@HomeActivity, "Clicked: ${item.price}", @@ -58,7 +57,9 @@ class HomeActivity : AppCompatActivity(), ).show() }.also { this@HomeActivity.adapter = it } } - + dao.getAllV().observe(this) { list -> + adapter.updateList(list) + } supportFragmentManager .beginTransaction() .replace(R.id.buttonPanel, BottomPanelFragment()) @@ -101,4 +102,4 @@ class HomeActivity : AppCompatActivity(), super.onBackPressed() } } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/example/projectfigma/Adapters/BestSellerAdapter.kt b/app/src/main/java/com/example/projectfigma/Adapters/BestSellerAdapter.kt index 68922a3..a27613d 100644 --- a/app/src/main/java/com/example/projectfigma/Adapters/BestSellerAdapter.kt +++ b/app/src/main/java/com/example/projectfigma/Adapters/BestSellerAdapter.kt @@ -11,7 +11,7 @@ import com.example.projectfigma.Entites.BestSeller import com.example.projectfigma.R class BestSellerAdapter( - private val items: List, + private var items: List, private val onClick: (BestSeller) -> Unit ) : RecyclerView.Adapter() { @@ -40,5 +40,10 @@ class BestSellerAdapter( holder.bind(items[position]) } + fun updateList(newItems: List) { + items = newItems + notifyDataSetChanged() + } + override fun getItemCount() = items.size } diff --git a/app/src/main/java/com/example/projectfigma/Adapters/PromoAdapter.kt b/app/src/main/java/com/example/projectfigma/Adapters/PromoAdapter.kt new file mode 100644 index 0000000..3545b5a --- /dev/null +++ b/app/src/main/java/com/example/projectfigma/Adapters/PromoAdapter.kt @@ -0,0 +1,44 @@ +package com.example.projectfigma.Adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import coil.load +import com.example.projectfigma.Entites.BestSeller +import com.example.projectfigma.R + +class PromoAdapter(private var items: List) : + RecyclerView.Adapter() { + + inner class VH(view: View) : RecyclerView.ViewHolder(view) { + private val image: ImageView = view.findViewById(R.id.promo_image) + private val title: TextView = view.findViewById(R.id.title) + private val discount: TextView = view.findViewById(R.id.discount) + + fun bind(item: BestSeller) { + title.text = "Experience our delicious new dish" + discount.text = "${30}% OFF" + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { + val v = LayoutInflater.from(parent.context) + .inflate(R.layout.item_banner, parent, false) + return VH(v) + } + + override fun onBindViewHolder(holder: VH, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int = items.size + + /** Вызываем из Activity/Fragment при получении новых данных */ + fun updateList(newItems: List) { + items = newItems + notifyDataSetChanged() + } +} diff --git a/app/src/main/java/com/example/projectfigma/DAO/BestSellerDao.kt b/app/src/main/java/com/example/projectfigma/DAO/BestSellerDao.kt index cb2d01f..ddbd62e 100644 --- a/app/src/main/java/com/example/projectfigma/DAO/BestSellerDao.kt +++ b/app/src/main/java/com/example/projectfigma/DAO/BestSellerDao.kt @@ -1,5 +1,6 @@ package com.example.projectfigma.DAO +import androidx.lifecycle.LiveData import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy @@ -18,4 +19,7 @@ interface BestSellerDao { // Вставить список объектов @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertAll(items: List) + + @Query("SELECT * FROM best_seller") + fun getAllV(): LiveData> } \ No newline at end of file diff --git a/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt b/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt new file mode 100644 index 0000000..653a024 --- /dev/null +++ b/app/src/main/java/com/example/projectfigma/Fragments/BannerFood.kt @@ -0,0 +1,87 @@ +package com.example.projectfigma.Fragments + +import android.os.Bundle +import android.os.Handler +import android.os.Looper +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.viewpager2.widget.ViewPager2 +import com.example.projectfigma.Adapters.PromoAdapter +import com.example.projectfigma.DataBase.DataBase +import com.example.projectfigma.R +import com.example.projectfigma.databinding.FragmentBannerFoodBinding +import com.example.projectfigma.databinding.FragmentBestSellerBinding +import com.google.android.material.tabs.TabLayout +import com.google.android.material.tabs.TabLayoutMediator + +class BannerFood : Fragment() { + private var _binding: FragmentBannerFoodBinding? = null + private val binding get() = _binding!! + private lateinit var promoAdapter: PromoAdapter + + + override fun onCreate(savedInstanceState: Bundle?) { + + super.onCreate(savedInstanceState) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + // 1) Инициализируем адаптер + promoAdapter = PromoAdapter(emptyList()) + binding.viewPager.adapter = promoAdapter + + // 2) Настраиваем TabLayoutMediator, сразу задаём иконки + TabLayoutMediator(binding.tabLayout, binding.viewPager) { tab, _ -> + tab.setIcon(R.drawable.tab_indicator_unselected) + }.attach() + + // 3) Подписываемся на смену вкладки, чтобы менять иконки + binding.tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab) { + tab.setIcon(R.drawable.tab_indicator_selected) + } + + override fun onTabUnselected(tab: TabLayout.Tab) { + tab.setIcon(R.drawable.tab_indicator_unselected) + } + + override fun onTabReselected(tab: TabLayout.Tab) {} + }) + + // 4) Тут же можете запустить автопрокрутку, если она нужна в фрагменте + val handler = Handler(Looper.getMainLooper()) + handler.postDelayed(object : Runnable { + override fun run() { + if (promoAdapter.itemCount > 1) { + val next = (binding.viewPager.currentItem + 1) % promoAdapter.itemCount + binding.viewPager.setCurrentItem(next, true) + } + handler.postDelayed(this, 4000) + } + }, 4000) + + // 5) А обновление списка (LiveData) можно тоже повесить здесь: + val dao = DataBase.getDb(requireContext()).getBestSellerDao() + dao.getAllV().observe(viewLifecycleOwner) { list -> + promoAdapter.updateList(list) + } + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentBannerFoodBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_banner.xml b/app/src/main/res/drawable/bg_banner.xml new file mode 100644 index 0000000..a46bcbc --- /dev/null +++ b/app/src/main/res/drawable/bg_banner.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/circle_yellow.xml b/app/src/main/res/drawable/circle_yellow.xml new file mode 100644 index 0000000..bb105fa --- /dev/null +++ b/app/src/main/res/drawable/circle_yellow.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/dot_active.xml b/app/src/main/res/drawable/dot_active.xml new file mode 100644 index 0000000..5336cfa --- /dev/null +++ b/app/src/main/res/drawable/dot_active.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/dot_inactive.xml b/app/src/main/res/drawable/dot_inactive.xml new file mode 100644 index 0000000..967b91d --- /dev/null +++ b/app/src/main/res/drawable/dot_inactive.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/indicator_selected.xml b/app/src/main/res/drawable/indicator_selected.xml new file mode 100644 index 0000000..914286d --- /dev/null +++ b/app/src/main/res/drawable/indicator_selected.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/indicator_unselected.xml b/app/src/main/res/drawable/indicator_unselected.xml new file mode 100644 index 0000000..7debbdb --- /dev/null +++ b/app/src/main/res/drawable/indicator_unselected.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/pizza_sample.png b/app/src/main/res/drawable/pizza_sample.png new file mode 100644 index 0000000..e61c709 Binary files /dev/null and b/app/src/main/res/drawable/pizza_sample.png differ diff --git a/app/src/main/res/drawable/tab_indicator_selected.xml b/app/src/main/res/drawable/tab_indicator_selected.xml new file mode 100644 index 0000000..5ea680d --- /dev/null +++ b/app/src/main/res/drawable/tab_indicator_selected.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/tab_indicator_unselected.xml b/app/src/main/res/drawable/tab_indicator_unselected.xml new file mode 100644 index 0000000..7c69e33 --- /dev/null +++ b/app/src/main/res/drawable/tab_indicator_unselected.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml index 90d8955..f58692a 100644 --- a/app/src/main/res/layout/activity_home.xml +++ b/app/src/main/res/layout/activity_home.xml @@ -6,7 +6,6 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_banner_food.xml b/app/src/main/res/layout/fragment_banner_food.xml new file mode 100644 index 0000000..ff044a3 --- /dev/null +++ b/app/src/main/res/layout/fragment_banner_food.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/app/src/main/res/layout/item_banner.xml b/app/src/main/res/layout/item_banner.xml new file mode 100644 index 0000000..2cd74b0 --- /dev/null +++ b/app/src/main/res/layout/item_banner.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..1eb1848 --- /dev/null +++ b/app/src/main/res/values/styles.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + +