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 io.legado.app.R
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.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.sdk27.listeners.onClick
import org.jetbrains.anko.textColorResource
class RssArticlesAdapter(context: Context, private val layoutId: Int, val callBack: CallBack) :
SimpleRecyclerAdapter<RssArticle>(context, layoutId) {
class RssArticlesAdapter(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) {
@ -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 androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
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.view_load_more.view.*
import kotlinx.android.synthetic.main.view_refresh_recycler.*
import org.jetbrains.anko.padding
class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragment_rss_articles),
RssArticlesAdapter.CallBack {
RssArticlesBaseAdapter.CallBack {
companion object {
fun create(sortName: String, sortUrl: String): RssArticlesFragment {
@ -40,7 +42,7 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
get() = getViewModelOfActivity(RssSortViewModel::class.java)
override val viewModel: RssArticlesViewModel
get() = getViewModel(RssArticlesViewModel::class.java)
lateinit var adapter: RssArticlesAdapter
lateinit var adapter: RssArticlesBaseAdapter
private lateinit var loadMoreView: LoadMoreView
private var rssArticlesData: LiveData<List<RssArticle>>? = null
@ -59,8 +61,6 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
private fun initView() {
ATH.applyEdgeEffectColor(recycler_view)
recycler_view.layoutManager = LinearLayoutManager(requireContext())
recycler_view.addItemDecoration(VerticalDivider(requireContext()))
var rssLayoutConfig = AppConfig.rssLayout
var layoutId = R.layout.item_rss_article
@ -69,7 +69,19 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
else if (rssLayoutConfig == 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
loadMoreView = LoadMoreView(requireContext())
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)
}
<<<<<<< HEAD
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
return super.onPrepareOptionsMenu(menu)
}
=======
>>>>>>> 6c28abcdcd7b57f40de92223ec9e6241805e2b7c
override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_edit_source -> viewModel.rssSource?.sourceUrl?.let {
@ -60,12 +57,9 @@ class RssSortActivity : VMBaseActivity<RssSortViewModel>(R.layout.activity_rss_a
viewModel.clearArticles()
}
}
<<<<<<< HEAD
R.id.menu_switch_layout -> {
switchLayout()
}
=======
>>>>>>> 6c28abcdcd7b57f40de92223ec9e6241805e2b7c
}
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:layout_width="110dp"
android:layout_height="68dp"
android:contentDescription="@string/img_cover"
android:contentDescription="@string/loading"
android:paddingLeft="16dp"
android:visibility="gone"
android:scaleType="centerCrop"

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

@ -2,49 +2,52 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
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_height="100dp"
android:padding="16dp">
android:layout_height="wrap_content">
<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
android:id="@+id/tv_title"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_height="wrap_content"
android:maxLines="2"
android:ellipsize="end"
android:text="@string/app_name"
android:textColor="@color/tv_text_default"
android:textSize="16sp"
android:textStyle="bold"
app:layout_constraintBottom_toTopOf="@+id/tv_pub_date"
android:textSize="12sp"
android:paddingTop="10dp"
app:layout_constraintTop_toBottomOf="@+id/image_view"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/image_view"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintRight_toRightOf="parent" />
<TextView
android:id="@+id/tv_pub_date"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="8dp"
android:text="@string/app_name"
android:textSize="12sp"
android:textStyle="italic"
android:textSize="10sp"
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_constraintRight_toLeftOf="@+id/image_view" />
<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" />
app:layout_constraintRight_toRightOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Loading…
Cancel
Save