rss 添加两种布局

pull/219/head
yangyxd 5 years ago
parent 8130256962
commit 0bf0c340bf
  1. 17
      app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt
  2. 24
      app/src/main/java/io/legado/app/ui/rss/article/RssArticlesBaseAdapter.kt
  3. 22
      app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt
  4. 63
      app/src/main/java/io/legado/app/ui/rss/article/RssArticlesGridAdapter.kt
  5. 6
      app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt
  6. 8
      app/src/main/res/drawable/bg_img_border.xml
  7. 2
      app/src/main/res/layout/item_rss_article.xml
  8. 25
      app/src/main/res/layout/item_rss_article_1.xml
  9. 53
      app/src/main/res/layout/item_rss_article_2.xml

@ -8,18 +8,16 @@ import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.target.Target
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.data.entities.RssArticle import io.legado.app.data.entities.RssArticle
import io.legado.app.help.ImageLoader import io.legado.app.help.ImageLoader
import io.legado.app.utils.gone import io.legado.app.utils.gone
import io.legado.app.utils.visible import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.item_rss_article.view.* import kotlinx.android.synthetic.main.item_rss_article.view.*
import org.jetbrains.anko.sdk27.listeners.onClick
import org.jetbrains.anko.textColorResource import org.jetbrains.anko.textColorResource
class RssArticlesAdapter(context: Context, private val layoutId: Int, val callBack: CallBack) : class RssArticlesAdapter(context: Context, private val layoutId: Int, callBack: CallBack) :
SimpleRecyclerAdapter<RssArticle>(context, layoutId) { RssArticlesBaseAdapter(context, layoutId, callBack) {
override fun convert(holder: ItemViewHolder, item: RssArticle, payloads: MutableList<Any>) { override fun convert(holder: ItemViewHolder, item: RssArticle, payloads: MutableList<Any>) {
with(holder.itemView) { with(holder.itemView) {
@ -62,15 +60,4 @@ class RssArticlesAdapter(context: Context, private val layoutId: Int, val callBa
} }
} }
override fun registerListener(holder: ItemViewHolder) {
holder.itemView.onClick {
getItem(holder.layoutPosition)?.let {
callBack.readRss(it)
}
}
}
interface CallBack {
fun readRss(rssArticle: RssArticle)
}
} }

@ -0,0 +1,24 @@
package io.legado.app.ui.rss.article
import android.content.Context
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.data.entities.RssArticle
import org.jetbrains.anko.sdk27.listeners.onClick
abstract class RssArticlesBaseAdapter(context: Context, private val layoutId: Int, val callBack: CallBack) :
SimpleRecyclerAdapter<RssArticle>(context, layoutId) {
override fun registerListener(holder: ItemViewHolder) {
holder.itemView.onClick {
getItem(holder.layoutPosition)?.let {
callBack.readRss(it)
}
}
}
interface CallBack {
fun readRss(rssArticle: RssArticle)
}
}

@ -4,6 +4,7 @@ import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.legado.app.App import io.legado.app.App
@ -21,9 +22,10 @@ import io.legado.app.utils.startActivity
import kotlinx.android.synthetic.main.fragment_rss_articles.* import kotlinx.android.synthetic.main.fragment_rss_articles.*
import kotlinx.android.synthetic.main.view_load_more.view.* import kotlinx.android.synthetic.main.view_load_more.view.*
import kotlinx.android.synthetic.main.view_refresh_recycler.* import kotlinx.android.synthetic.main.view_refresh_recycler.*
import org.jetbrains.anko.padding
class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragment_rss_articles), class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragment_rss_articles),
RssArticlesAdapter.CallBack { RssArticlesBaseAdapter.CallBack {
companion object { companion object {
fun create(sortName: String, sortUrl: String): RssArticlesFragment { fun create(sortName: String, sortUrl: String): RssArticlesFragment {
@ -40,7 +42,7 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
get() = getViewModelOfActivity(RssSortViewModel::class.java) get() = getViewModelOfActivity(RssSortViewModel::class.java)
override val viewModel: RssArticlesViewModel override val viewModel: RssArticlesViewModel
get() = getViewModel(RssArticlesViewModel::class.java) get() = getViewModel(RssArticlesViewModel::class.java)
lateinit var adapter: RssArticlesAdapter lateinit var adapter: RssArticlesBaseAdapter
private lateinit var loadMoreView: LoadMoreView private lateinit var loadMoreView: LoadMoreView
private var rssArticlesData: LiveData<List<RssArticle>>? = null private var rssArticlesData: LiveData<List<RssArticle>>? = null
@ -59,8 +61,6 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
private fun initView() { private fun initView() {
ATH.applyEdgeEffectColor(recycler_view) ATH.applyEdgeEffectColor(recycler_view)
recycler_view.layoutManager = LinearLayoutManager(requireContext())
recycler_view.addItemDecoration(VerticalDivider(requireContext()))
var rssLayoutConfig = AppConfig.rssLayout var rssLayoutConfig = AppConfig.rssLayout
var layoutId = R.layout.item_rss_article var layoutId = R.layout.item_rss_article
@ -69,7 +69,19 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
else if (rssLayoutConfig == 2) else if (rssLayoutConfig == 2)
layoutId = R.layout.item_rss_article_2 layoutId = R.layout.item_rss_article_2
adapter = RssArticlesAdapter(requireContext(), layoutId, this) if (rssLayoutConfig == 2) {
recycler_view.padding = 8
recycler_view.layoutManager = GridLayoutManager(requireContext(), 2)
while (recycler_view.itemDecorationCount > 0)
recycler_view.removeItemDecorationAt(0)
adapter = RssArticlesGridAdapter(requireContext(), layoutId, this)
} else {
recycler_view.padding = 0
recycler_view.layoutManager = LinearLayoutManager(requireContext())
recycler_view.addItemDecoration(VerticalDivider(requireContext()))
adapter = RssArticlesAdapter(requireContext(), layoutId, this)
}
recycler_view.adapter = adapter recycler_view.adapter = adapter
loadMoreView = LoadMoreView(requireContext()) loadMoreView = LoadMoreView(requireContext())
adapter.addFooterView(loadMoreView) adapter.addFooterView(loadMoreView)

@ -0,0 +1,63 @@
package io.legado.app.ui.rss.article
import android.content.Context
import android.graphics.drawable.Drawable
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.data.entities.RssArticle
import io.legado.app.help.ImageLoader
import io.legado.app.utils.gone
import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.item_rss_article.view.*
import org.jetbrains.anko.textColorResource
class RssArticlesGridAdapter(context: Context, private val layoutId: Int, callBack: CallBack) :
RssArticlesBaseAdapter(context, layoutId, callBack) {
override fun convert(holder: ItemViewHolder, item: RssArticle, payloads: MutableList<Any>) {
with(holder.itemView) {
tv_title.text = item.title
tv_pub_date.text = item.pubDate
if (item.image.isNullOrBlank()) {
image_view.gone()
} else {
ImageLoader.load(context, item.image)
.addListener(object : RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
image_view.gone()
return false
}
override fun onResourceReady(
resource: Drawable?,
model: Any?,
target: Target<Drawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
image_view.visible()
return false
}
})
.into(image_view)
}
if (item.read) {
tv_title.textColorResource = R.color.tv_text_summary
} else {
tv_title.textColorResource = R.color.tv_text_default
}
}
}
}

@ -43,13 +43,10 @@ class RssSortActivity : VMBaseActivity<RssSortViewModel>(R.layout.activity_rss_a
return super.onCompatCreateOptionsMenu(menu) return super.onCompatCreateOptionsMenu(menu)
} }
<<<<<<< HEAD
override fun onPrepareOptionsMenu(menu: Menu?): Boolean { override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
return super.onPrepareOptionsMenu(menu) return super.onPrepareOptionsMenu(menu)
} }
=======
>>>>>>> 6c28abcdcd7b57f40de92223ec9e6241805e2b7c
override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.menu_edit_source -> viewModel.rssSource?.sourceUrl?.let { R.id.menu_edit_source -> viewModel.rssSource?.sourceUrl?.let {
@ -60,12 +57,9 @@ class RssSortActivity : VMBaseActivity<RssSortViewModel>(R.layout.activity_rss_a
viewModel.clearArticles() viewModel.clearArticles()
} }
} }
<<<<<<< HEAD
R.id.menu_switch_layout -> { R.id.menu_switch_layout -> {
switchLayout() switchLayout()
} }
=======
>>>>>>> 6c28abcdcd7b57f40de92223ec9e6241805e2b7c
} }
return super.onCompatOptionsItemSelected(item) return super.onCompatOptionsItemSelected(item)
} }

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/background" />
<stroke android:width="1dp" android:color="@color/bg_divider_line" />
<corners android:radius="1dp" />
<padding android:left="0dp" android:top="0dp"
android:right="0dp" android:bottom="0dp" />
</shape>

@ -39,7 +39,7 @@
android:id="@+id/image_view" android:id="@+id/image_view"
android:layout_width="110dp" android:layout_width="110dp"
android:layout_height="68dp" android:layout_height="68dp"
android:contentDescription="@string/img_cover" android:contentDescription="@string/loading"
android:paddingLeft="16dp" android:paddingLeft="16dp"
android:visibility="gone" android:visibility="gone"
android:scaleType="centerCrop" android:scaleType="centerCrop"

@ -3,17 +3,16 @@
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content">
android:padding="14dp">
<ImageView <ImageView
android:id="@+id/image_view" android:id="@+id/image_view"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="200dp"
android:contentDescription="@string/img_cover" android:contentDescription="@string/loading"
android:visibility="gone" android:visibility="visible"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:layout_marginBottom="12dp" android:padding="12dp"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
@ -29,6 +28,8 @@
android:textColor="@color/tv_text_default" android:textColor="@color/tv_text_default"
android:textSize="15sp" android:textSize="15sp"
android:textStyle="bold" android:textStyle="bold"
android:paddingLeft="12dp"
android:paddingRight="12dp"
app:layout_constraintTop_toBottomOf="@+id/image_view" app:layout_constraintTop_toBottomOf="@+id/image_view"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" /> app:layout_constraintRight_toRightOf="parent" />
@ -38,14 +39,22 @@
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginTop="16dp"
android:text="@string/app_name" android:text="@string/app_name"
android:textSize="12sp" android:textSize="10sp"
android:maxLines="1" android:maxLines="1"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:paddingTop="10dp"
app:layout_constraintTop_toBottomOf="@+id/tv_title" app:layout_constraintTop_toBottomOf="@+id/tv_title"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" /> app:layout_constraintRight_toRightOf="parent" />
<View
android:layout_marginTop="12dp"
app:layout_constraintTop_toBottomOf="@+id/tv_pub_date"
android:layout_height="8dp"
android:layout_width="match_parent"
android:background="@color/bg_divider_line" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>

@ -2,49 +2,52 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:paddingLeft="5dp"
android:paddingTop="6dp"
android:paddingBottom="6dp"
android:paddingRight="5dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="100dp" android:layout_height="wrap_content">
android:padding="16dp">
<ImageView
android:id="@+id/image_view"
android:layout_width="0dp"
android:layout_height="272dp"
android:contentDescription="@string/loading"
android:visibility="visible"
android:scaleType="centerCrop"
android:background="@drawable/bg_img_border"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
tools:ignore="RtlHardcoded,RtlSymmetry" />
<TextView <TextView
android:id="@+id/tv_title" android:id="@+id/tv_title"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="wrap_content"
android:maxLines="2" android:maxLines="2"
android:ellipsize="end" android:ellipsize="end"
android:text="@string/app_name" android:text="@string/app_name"
android:textColor="@color/tv_text_default" android:textColor="@color/tv_text_default"
android:textSize="16sp" android:textSize="12sp"
android:textStyle="bold" android:paddingTop="10dp"
app:layout_constraintBottom_toTopOf="@+id/tv_pub_date" app:layout_constraintTop_toBottomOf="@+id/image_view"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/image_view" app:layout_constraintRight_toRightOf="parent" />
app:layout_constraintTop_toTopOf="parent" />
<TextView <TextView
android:id="@+id/tv_pub_date" android:id="@+id/tv_pub_date"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginTop="8dp"
android:text="@string/app_name" android:text="@string/app_name"
android:textSize="12sp" android:textSize="10sp"
android:textStyle="italic"
android:maxLines="1" android:maxLines="1"
app:layout_constraintBottom_toBottomOf="parent" android:paddingTop="8dp"
android:paddingBottom="2dp"
app:layout_constraintTop_toBottomOf="@+id/tv_title"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/image_view" /> app:layout_constraintRight_toRightOf="parent" />
<ImageView
android:id="@+id/image_view"
android:layout_width="110dp"
android:layout_height="68dp"
android:contentDescription="@string/img_cover"
android:paddingLeft="16dp"
android:visibility="gone"
android:scaleType="centerCrop"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:ignore="RtlHardcoded,RtlSymmetry" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
Loading…
Cancel
Save