From 4a8b21891643d3e87e1a4e700a7cd83fe85f11dd Mon Sep 17 00:00:00 2001 From: HapeLee <1321903405@qq.com> Date: Fri, 24 Oct 2025 00:25:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E9=98=85=E6=BA=90=E7=80=91=E5=B8=83?= =?UTF-8?q?=E6=B5=81=20#121=20(@Luoyacheng)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legato/kazusa/ui/main/rss/RssFragment.kt | 4 +- .../ui/rss/article/RssArticlesAdapter3.kt | 91 +++++++++++++++++++ .../ui/rss/article/RssArticlesFragment.kt | 10 +- .../kazusa/ui/rss/article/RssSortViewModel.kt | 3 +- app/src/main/res/layout/item_rss.xml | 71 ++++++++------- app/src/main/res/layout/item_rss_article.xml | 17 +++- .../main/res/layout/item_rss_article_1.xml | 15 ++- .../main/res/layout/item_rss_article_2.xml | 91 ++++++++++--------- .../main/res/layout/item_rss_article_3.xml | 58 ++++++++++++ 9 files changed, 271 insertions(+), 89 deletions(-) create mode 100644 app/src/main/java/io/legato/kazusa/ui/rss/article/RssArticlesAdapter3.kt create mode 100644 app/src/main/res/layout/item_rss_article_3.xml diff --git a/app/src/main/java/io/legato/kazusa/ui/main/rss/RssFragment.kt b/app/src/main/java/io/legato/kazusa/ui/main/rss/RssFragment.kt index 9594f5184..e02a4c155 100644 --- a/app/src/main/java/io/legato/kazusa/ui/main/rss/RssFragment.kt +++ b/app/src/main/java/io/legato/kazusa/ui/main/rss/RssFragment.kt @@ -136,10 +136,8 @@ class RssFragment() : VMBaseFragment(R.layout.fragment_rss), if (actionId == EditorInfo.IME_ACTION_SEARCH) { val query = searchView.text.toString() upRssFlowJob(query) - searchBar.hint = if (query.isEmpty()) { + searchBar.hint = query.ifEmpty { getString(R.string.search_rss_source) - } else { - query } searchView.hide() return@setOnEditorActionListener true diff --git a/app/src/main/java/io/legato/kazusa/ui/rss/article/RssArticlesAdapter3.kt b/app/src/main/java/io/legato/kazusa/ui/rss/article/RssArticlesAdapter3.kt new file mode 100644 index 000000000..f0b8be6fc --- /dev/null +++ b/app/src/main/java/io/legato/kazusa/ui/rss/article/RssArticlesAdapter3.kt @@ -0,0 +1,91 @@ +package io.legato.kazusa.ui.rss.article + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.drawable.Drawable +import android.view.ViewGroup +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.request.target.Target +import io.legato.kazusa.R +import io.legato.kazusa.base.adapter.ItemViewHolder +import io.legato.kazusa.data.entities.RssArticle +import io.legato.kazusa.databinding.ItemRssArticle3Binding +import io.legato.kazusa.help.glide.ImageLoader +import io.legato.kazusa.help.glide.OkHttpModelLoader +import io.legato.kazusa.utils.gone +import io.legato.kazusa.utils.themeColor +import io.legato.kazusa.utils.visible + +class RssArticlesAdapter3(context: Context, callBack: CallBack) : + BaseRssArticlesAdapter(context, callBack) { + + override fun getViewBinding(parent: ViewGroup): ItemRssArticle3Binding { + return ItemRssArticle3Binding.inflate(inflater, parent, false) + } + + @SuppressLint("CheckResult") + override fun convert( + holder: ItemViewHolder, + binding: ItemRssArticle3Binding, + item: RssArticle, + payloads: MutableList + ) { + binding.run { + tvTitle.text = item.title + tvPubDate.text = item.pubDate + + val imageUrl = item.image + if (imageUrl.isNullOrBlank() && !callBack.isGridLayout) { + imageView.gone() + } else { + imageView.visible() + imageView.adjustViewBounds = true + val options = RequestOptions() + .set(OkHttpModelLoader.sourceOriginOption, item.origin) + + ImageLoader.load(context, imageUrl) + .apply(options) + .listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + imageView.gone() + return false + } + + override fun onResourceReady( + resource: Drawable, + model: Any, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + return false + } + }) + .into(imageView) + } + + tvTitle.setTextColor( + if (item.read) + context.themeColor(com.google.android.material.R.attr.colorOnSurfaceVariant) + else + context.themeColor(com.google.android.material.R.attr.colorOnSurface) + ) + } + } + + override fun registerListener(holder: ItemViewHolder, binding: ItemRssArticle3Binding) { + holder.itemView.setOnClickListener { + getItem(holder.layoutPosition)?.let { + callBack.readRss(it) + } + } + } +} diff --git a/app/src/main/java/io/legato/kazusa/ui/rss/article/RssArticlesFragment.kt b/app/src/main/java/io/legato/kazusa/ui/rss/article/RssArticlesFragment.kt index 1d62fbef1..372731e7d 100644 --- a/app/src/main/java/io/legato/kazusa/ui/rss/article/RssArticlesFragment.kt +++ b/app/src/main/java/io/legato/kazusa/ui/rss/article/RssArticlesFragment.kt @@ -11,6 +11,7 @@ import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.StaggeredGridLayoutManager import io.legato.kazusa.R import io.legato.kazusa.base.VMBaseFragment import io.legato.kazusa.constant.AppLog @@ -50,6 +51,7 @@ class RssArticlesFragment() : VMBaseFragment(R.layout.frag when (activityViewModel.rssSource?.articleStyle) { 1 -> RssArticlesAdapter1(requireContext(), this@RssArticlesFragment) 2 -> RssArticlesAdapter2(requireContext(), this@RssArticlesFragment) + 3 -> RssArticlesAdapter3(requireContext(), this@RssArticlesFragment) else -> RssArticlesAdapter(requireContext(), this@RssArticlesFragment) } } @@ -75,13 +77,15 @@ class RssArticlesFragment() : VMBaseFragment(R.layout.frag scrollToBottom(true) } } - recyclerView.layoutManager = if (activityViewModel.isGridLayout) { - recyclerView.setPadding(8, 0, 8, 0) + val layoutManager = if (activityViewModel.isWaterLayout) { + recyclerView.itemAnimator = null + StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL) + } else if (activityViewModel.isGridLayout) { GridLayoutManager(requireContext(), 2) } else { - recyclerView.addItemDecoration(VerticalDivider(requireContext())) LinearLayoutManager(requireContext()) } + recyclerView.layoutManager = layoutManager recyclerView.adapter = adapter adapter.addFooterView { ViewLoadMoreBinding.bind(loadMoreView) diff --git a/app/src/main/java/io/legato/kazusa/ui/rss/article/RssSortViewModel.kt b/app/src/main/java/io/legato/kazusa/ui/rss/article/RssSortViewModel.kt index 5d002e1c1..63a521843 100644 --- a/app/src/main/java/io/legato/kazusa/ui/rss/article/RssSortViewModel.kt +++ b/app/src/main/java/io/legato/kazusa/ui/rss/article/RssSortViewModel.kt @@ -17,6 +17,7 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) { val titleLiveData = MutableLiveData() var order = System.currentTimeMillis() val isGridLayout get() = rssSource?.articleStyle == 2 + val isWaterLayout get() = rssSource?.articleStyle == 3 fun initData(intent: Intent, finally: () -> Unit) { execute { @@ -36,7 +37,7 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) { fun switchLayout() { rssSource?.let { - if (it.articleStyle < 2) { + if (it.articleStyle < 3) { it.articleStyle += 1 } else { it.articleStyle = 0 diff --git a/app/src/main/res/layout/item_rss.xml b/app/src/main/res/layout/item_rss.xml index b262ef601..9a4e70916 100644 --- a/app/src/main/res/layout/item_rss.xml +++ b/app/src/main/res/layout/item_rss.xml @@ -1,40 +1,49 @@ - + app:strokeWidth="0dp" + app:cardBackgroundColor="@android:color/transparent" + android:layout_margin="4dp"> - - - + android:focusable="true" + android:foreground="?android:attr/selectableItemBackground" + android:padding="12dp" + android:scrollbars="none"> + - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_rss_article.xml b/app/src/main/res/layout/item_rss_article.xml index f0c78242a..ef0328b33 100644 --- a/app/src/main/res/layout/item_rss_article.xml +++ b/app/src/main/res/layout/item_rss_article.xml @@ -1,11 +1,17 @@ - + android:layout_height="wrap_content" + app:strokeWidth="0dp" + app:cardBackgroundColor="?attr/colorSurfaceContainer"> + - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_rss_article_1.xml b/app/src/main/res/layout/item_rss_article_1.xml index d521de3c5..2f85967ff 100644 --- a/app/src/main/res/layout/item_rss_article_1.xml +++ b/app/src/main/res/layout/item_rss_article_1.xml @@ -1,11 +1,17 @@ - + app:strokeWidth="0dp" + app:cardBackgroundColor="?attr/colorSurfaceContainer"> + - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_rss_article_2.xml b/app/src/main/res/layout/item_rss_article_2.xml index 37d2d11be..627b0dceb 100644 --- a/app/src/main/res/layout/item_rss_article_2.xml +++ b/app/src/main/res/layout/item_rss_article_2.xml @@ -1,51 +1,58 @@ - - - - - + android:background="?attr/colorSurfaceContainer"> - + - \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_rss_article_3.xml b/app/src/main/res/layout/item_rss_article_3.xml new file mode 100644 index 000000000..47d530b71 --- /dev/null +++ b/app/src/main/res/layout/item_rss_article_3.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + \ No newline at end of file