weather scroll

This commit is contained in:
JUNGGWAN KIM 2024-10-15 18:16:32 +09:00
parent 8fff21a6d8
commit 8cd2ffc16d
7 changed files with 126 additions and 25 deletions

View File

@ -97,6 +97,7 @@ dependencies {
implementation("com.squareup.retrofit2:converter-gson:2.6.4")
implementation("com.squareup.retrofit2:converter-scalars:2.6.4")
implementation("androidx.viewpager2:viewpager2:1.0.0")
implementation("com.squareup.picasso:picasso:2.71828")
// implementation ("me.everything:providers-android:1.0.1")
// implementation ("me.everything:providers-core:1.0.1")
// implementation ("androidx.window:window:1.0.0")

View File

@ -219,6 +219,25 @@ internal class LauncherHome : Fragment() {
binding.infoList.adapter = mRssAdapter
binding.notiList.adapter = mNotiAdapter
binding.noticeSummary.weatherViewPager.adapter = mWeatherAdapter
binding.noticeSummary.weatherViewPager.registerOnPageChangeCallback(object: ViewPager2.OnPageChangeCallback() {
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
// 페이지가 변경될 때 호출됨
mWeatherAdapter?.syncScroll(position)
}
override fun onPageScrollStateChanged(state: Int) {
super.onPageScrollStateChanged(state)
// 스크롤 상태가 변경될 때 호출됨
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels)
// 페이지 스크롤이 발생할 때 호출됨
}
})
binding.favAppsGroup.setOnClickListener { searchData() }
try{binding.mainList.removeOnScrollListener(onScrChanged)}catch (e : Exception){e.printStackTrace()}
@ -315,16 +334,16 @@ internal class LauncherHome : Fragment() {
}.find().let {hours ->
Handler(Looper.getMainLooper()).post {
weatherDressAdapter?.let {
it.update(
mutableListOf<Hour>().apply {
this.addAll(
it.update(
mutableListOf<Hour>().apply {
this.addAll(
// it.filter(hours)
hours
)
}
)
it.notifyDataSetChanged()
}
hours
)
}
)
it.notifyDataSetChanged()
}
weatherHourlyAdapter?.let {
it.update(
mutableListOf<Hour>().apply {

View File

@ -1,13 +1,18 @@
package rasel.lunar.launcher.home.adapters
import android.annotation.SuppressLint
import android.os.Handler
import android.os.Looper
import android.view.LayoutInflater
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.LinearSnapHelper
import androidx.recyclerview.widget.RecyclerView
import rasel.lunar.launcher.R
import rasel.lunar.launcher.databinding.WeatherBookBinding
import rasel.lunar.launcher.utils.BLog
class WeatherAdapter(
private val pages: List<Int>,
@ -17,26 +22,86 @@ class WeatherAdapter(
class PageViewHolder(val view: View): RecyclerView.ViewHolder(view)
var childs : ArrayList<RecyclerView> = arrayListOf<RecyclerView>()
@SuppressLint("ResourceType")
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PageViewHolder {
return PageViewHolder(LayoutInflater.from(parent.context).inflate(pages[viewType], parent, false))
val layoutInflater = LayoutInflater.from(parent.context).inflate(pages[viewType], parent, false)
// var first = layoutInflater.findViewById<RecyclerView>(R.id.recycler_hourly_weather)
// var second = layoutInflater.findViewById<RecyclerView>(R.id.weather_dress_recycller)
return PageViewHolder(layoutInflater)
}
fun syncScroll(newPosition: Int) {
childs[newPosition].let {recyclerView ->
BLog.LOGE("recyclerView >>> ${recyclerView} 1 ")
if (!isSyncingScroll) {
isSyncingScroll = true
BLog.LOGE("recyclerView >>> ${recyclerView} 2 ")
childs.forEach { c ->
// val visibleItemCount = (layoutManager?.findLastVisibleItemPosition() ?: 0) - (layoutManager?.findFirstVisibleItemPosition() ?: 0)
if (c != recyclerView) {
(c.layoutManager as LinearLayoutManager)?.let {
it.findFirstVisibleItemPosition()?.let {
(recyclerView?.layoutManager as? LinearLayoutManager)?.let { target ->
target.scrollToPositionWithOffset(it, 0)
}
// .scrollToPosition(it)
}
}
BLog.LOGE("recyclerView >>> ${recyclerView} 3 ")
}
}
isSyncingScroll = false
BLog.LOGE("recyclerView >>> ${recyclerView} 4 ")
}
}
}
val mOnScrollListener = object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
// recyclerView.postDelayed({syncScroll(recyclerView)},10L)
// recyclerView.post{syncScroll(recyclerView)}
}
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
}
}
var isSyncingScroll = false
override fun onBindViewHolder(holder: PageViewHolder, position: Int) {
if (adatpers[position] != null) {
when (position) {
0 -> holder.view.findViewById<RecyclerView>(R.id.recycler_hourly_weather).apply {
this.adapter = adatpers[position]
this.layoutManager =
LinearLayoutManager(this.context, LinearLayoutManager.HORIZONTAL, false)
}
else -> holder.view.findViewById<RecyclerView>(R.id.weather_dress_recycller).apply {
this.adapter = adatpers[position]
this.layoutManager =
LinearLayoutManager(this.context, LinearLayoutManager.HORIZONTAL, false)
(holder.view as RecyclerView).apply {
this.adapter = adatpers[position]
this.layoutManager = LinearLayoutManager(this.context, LinearLayoutManager.HORIZONTAL, false)
if (!childs.contains(this)) {
childs.add(this)
this.addOnScrollListener(mOnScrollListener)
LinearSnapHelper().attachToRecyclerView(this)
}
}
// when (position) {
// 0 -> holder.view.findViewById<RecyclerView>(R.id.recycler_hourly_weather).apply {
// this.adapter = adatpers[position]
// this.layoutManager =
//
// }
//
// else -> holder.view.findViewById<RecyclerView>(R.id.weather_dress_recycller).apply {
// this.adapter = adatpers[position]
// this.layoutManager =
// LinearLayoutManager(this.context, LinearLayoutManager.HORIZONTAL, false)
// }
// }
}
}

View File

@ -5,7 +5,9 @@ import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.net.toUri
import androidx.recyclerview.widget.RecyclerView
import com.squareup.picasso.Picasso
import rasel.lunar.launcher.databinding.ItemHourlyWeatherBinding
import rasel.lunar.launcher.databinding.ItemRecHourlyDressBinding
import rasel.lunar.launcher.model.Hour
@ -26,6 +28,9 @@ class WeatherHourlyAdapter(private val dataSet: ArrayList<Hour>): RecyclerView.A
data?.let {
WeatherInfoManager.getShowingInfo(it).apply {
holder.viewItem.setInfo(this)
Picasso.get()
.load(this.urlImgWeather)
.into(holder.viewItem.imgWeather)
}
BLog.LOGE("reeeeeeeeeee >>> ${holder.viewItem.hour.text}")
holder.viewItem.amOrPm.visibility =
@ -41,7 +46,6 @@ class WeatherHourlyAdapter(private val dataSet: ArrayList<Hour>): RecyclerView.A
this@apply.isSelected = false
}
}
holder.viewItem.imgDress.setImageLevel(it.temp_c.toInt())
}
}

View File

@ -18,6 +18,8 @@ class ShowingWeatherInfo() {
var dress: String? = null
var imgDress: Int? = null
var temp: String? = null
var textCondition: String? = null
var urlImgWeather: String? = null
fun setLocation(loc: Location?): ShowingWeatherInfo {
textLocation = "${loc?.name ?: "도시"} / ${loc?.country ?: "나라"}"
@ -28,6 +30,8 @@ class ShowingWeatherInfo() {
setTextHour(hour)
setDress(hour)
setTemp(hour)
setTextCondition(hour)
setUrlImgWeather(hour)
return this
}
private fun setAmOrPm(hour: Hour) = WeatherInfoManager.toZonedDateTime(hour.time_epoch).hour.run {
@ -69,6 +73,14 @@ class ShowingWeatherInfo() {
}
}
private fun setTemp(hour: Hour) {temp = "${hour.temp_c}"}
private fun setTextCondition(hour: Hour) {textCondition = hour.condition?.text}
private fun setUrlImgWeather(hour: Hour) {
hour.condition?.icon?.let {
urlImgWeather = if (!it.contains("https:")) "https:$it" else it
}
}
}
object WeatherInfoManager {

View File

@ -29,7 +29,7 @@
android:text="@{info.textHour}"
android:textAlignment="center"/>
<ImageView
android:id="@+id/imgDress"
android:id="@+id/imgWeather"
android:layout_width="40dp"
android:src="@drawable/level_dress_img"
android:layout_height="40dp"
@ -41,7 +41,7 @@
android:id="@+id/textDress"
android:fontFamily="sans-serif-light"
android:textSize="11sp"
android:text="@{info.dress}"
android:text="@{info.textCondition}"
android:gravity="center"
android:textAlignment="center"/>
<TextView

View File

@ -58,7 +58,7 @@
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/weatherViewPager"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_height="130dp"
app:layout_constraintTop_toBottomOf="@+id/header"
app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>