pull/517/head
gedoor 5 years ago
parent 2f9d6936c5
commit 448c9077d7
  1. 70
      app/src/main/java/io/legado/app/base/adapter/CommonRecyclerAdapter.kt
  2. 4
      app/src/main/java/io/legado/app/ui/book/explore/ExploreShowActivity.kt
  3. 20
      app/src/main/java/io/legado/app/ui/book/read/config/BgTextConfigDialog.kt
  4. 23
      app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt
  5. 4
      app/src/main/java/io/legado/app/ui/main/rss/RssAdapter.kt
  6. 7
      app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt
  7. 4
      app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt

@ -32,8 +32,8 @@ abstract class CommonRecyclerAdapter<ITEM, VB : ViewBinding>(protected val conte
val inflater: LayoutInflater = LayoutInflater.from(context)
private var headerItems: SparseArray<ViewBinding>? = null
private var footerItems: SparseArray<ViewBinding>? = null
private val headerItems: SparseArray<(parent: ViewGroup) -> ViewBinding> by lazy { SparseArray() }
private val footerItems: SparseArray<(parent: ViewGroup) -> ViewBinding> by lazy { SparseArray() }
private val itemDelegates: HashMap<Int, ItemViewDelegate<ITEM, VB>> = hashMapOf()
private val items: MutableList<ITEM> = mutableListOf()
@ -80,51 +80,37 @@ abstract class CommonRecyclerAdapter<ITEM, VB : ViewBinding>(protected val conte
addItemViewDelegate(it.first, it.second)
}
fun addHeaderView(header: ViewBinding) {
fun addHeaderView(header: ((parent: ViewGroup) -> ViewBinding)) {
synchronized(lock) {
if (headerItems == null) {
headerItems = SparseArray()
}
headerItems?.let {
val index = it.size()
it.put(TYPE_HEADER_VIEW + it.size(), header)
notifyItemInserted(index)
}
val index = headerItems.size()
headerItems.put(TYPE_HEADER_VIEW + headerItems.size(), header)
notifyItemInserted(index)
}
}
fun addFooterView(footer: ViewBinding) =
fun addFooterView(footer: ((parent: ViewGroup) -> ViewBinding)) =
synchronized(lock) {
if (footerItems == null) {
footerItems = SparseArray()
}
footerItems?.let {
val index = getActualItemCount() + it.size()
it.put(TYPE_FOOTER_VIEW + it.size(), footer)
notifyItemInserted(index)
}
val index = getActualItemCount() + footerItems.size()
footerItems.put(TYPE_FOOTER_VIEW + footerItems.size(), footer)
notifyItemInserted(index)
}
fun removeHeaderView(header: ViewBinding) =
fun removeHeaderView(header: ((parent: ViewGroup) -> ViewBinding)) =
synchronized(lock) {
headerItems?.let {
val index = it.indexOfValue(header)
if (index >= 0) {
it.remove(index)
notifyItemRemoved(index)
}
val index = headerItems.indexOfValue(header)
if (index >= 0) {
headerItems.remove(index)
notifyItemRemoved(index)
}
}
fun removeFooterView(footer: ViewBinding) =
fun removeFooterView(footer: ((parent: ViewGroup) -> ViewBinding)) =
synchronized(lock) {
footerItems?.let {
val index = it.indexOfValue(footer)
if (index >= 0) {
it.remove(index)
notifyItemRemoved(getActualItemCount() + index - 2)
}
val index = footerItems.indexOfValue(footer)
if (index >= 0) {
footerItems.remove(index)
notifyItemRemoved(getActualItemCount() + index - 2)
}
}
@ -274,10 +260,10 @@ abstract class CommonRecyclerAdapter<ITEM, VB : ViewBinding>(protected val conte
fun getActualItemCount() = items.size
fun getHeaderCount() = headerItems?.size() ?: 0
fun getHeaderCount() = headerItems.size()
fun getFooterCount() = footerItems?.size() ?: 0
fun getFooterCount() = footerItems.size()
fun getItem(position: Int): ITEM? = items.getOrNull(position)
@ -290,7 +276,7 @@ abstract class CommonRecyclerAdapter<ITEM, VB : ViewBinding>(protected val conte
/**
* grid 模式下使用
*/
protected open fun getSpanSize(item: ITEM, viewType: Int, position: Int) = 1
protected open fun getSpanSize(viewType: Int, position: Int) = 1
final override fun getItemCount() = getActualItemCount() + getHeaderCount() + getFooterCount()
@ -304,11 +290,11 @@ abstract class CommonRecyclerAdapter<ITEM, VB : ViewBinding>(protected val conte
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = when {
viewType < TYPE_HEADER_VIEW + getHeaderCount() -> {
ItemViewHolder(headerItems!!.get(viewType))
ItemViewHolder(headerItems.get(viewType).invoke(parent))
}
viewType >= TYPE_FOOTER_VIEW -> {
ItemViewHolder(footerItems!!.get(viewType))
ItemViewHolder(footerItems.get(viewType).invoke(parent))
}
else -> {
@ -369,11 +355,7 @@ abstract class CommonRecyclerAdapter<ITEM, VB : ViewBinding>(protected val conte
if (manager is GridLayoutManager) {
manager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
override fun getSpanSize(position: Int): Int {
return getItem(position)?.let {
if (isHeader(position) || isFooter(position)) manager.spanCount else getSpanSize(
it, getItemViewType(position), position
)
} ?: manager.spanCount
return getSpanSize(getItemViewType(position), position)
}
}
}

@ -41,7 +41,9 @@ class ExploreShowActivity : VMBaseActivity<ActivityExploreShowBinding, ExploreSh
binding.recyclerView.addItemDecoration(VerticalDivider(this))
binding.recyclerView.adapter = adapter
loadMoreView = LoadMoreView(this)
adapter.addFooterView(ViewLoadMoreBinding.bind(loadMoreView))
adapter.addFooterView {
ViewLoadMoreBinding.bind(loadMoreView)
}
loadMoreView.startLoad()
loadMoreView.setOnClickListener {
if (!isLoading) {

@ -103,17 +103,15 @@ class BgTextConfigDialog : BaseDialogFragment(), FilePickerDialog.CallBack {
binding.swDarkStatusIcon.isChecked = curStatusIconDark()
adapter = BgAdapter(requireContext(), secondaryTextColor)
binding.recyclerView.adapter = adapter
val headerView = ItemBgImageBinding.inflate(
layoutInflater,
binding.recyclerView,
false
)
adapter.addHeaderView(headerView)
headerView.tvName.setTextColor(secondaryTextColor)
headerView.tvName.text = getString(R.string.select_image)
headerView.ivBg.setImageResource(R.drawable.ic_image)
headerView.ivBg.setColorFilter(primaryTextColor)
headerView.root.onClick { selectImage() }
adapter.addHeaderView {
ItemBgImageBinding.inflate(layoutInflater, it, false).apply {
tvName.setTextColor(secondaryTextColor)
tvName.text = getString(R.string.select_image)
ivBg.setImageResource(R.drawable.ic_image)
ivBg.setColorFilter(primaryTextColor)
root.onClick { selectImage() }
}
}
requireContext().assets.list("bg")?.let {
adapter.setItems(it.toList())
}

@ -86,17 +86,18 @@ class ReadStyleDialog : BaseDialogFragment(), FontSelectDialog.CallBack {
dsbParagraphSpacing.valueFormat = { (it / 10f).toString() }
styleAdapter = StyleAdapter()
rvStyle.adapter = styleAdapter
val footerBinding =
ItemReadStyleBinding.inflate(layoutInflater, rvStyle, false)
footerBinding.ivStyle.setPadding(6.dp, 6.dp, 6.dp, 6.dp)
footerBinding.ivStyle.setText(null)
footerBinding.ivStyle.setColorFilter(textColor)
footerBinding.ivStyle.borderColor = textColor
footerBinding.ivStyle.setImageResource(R.drawable.ic_add)
styleAdapter.addFooterView(footerBinding)
footerBinding.root.onClick {
ReadBookConfig.configList.add(ReadBookConfig.Config())
showBgTextConfig(ReadBookConfig.configList.lastIndex)
styleAdapter.addFooterView {
ItemReadStyleBinding.inflate(layoutInflater, it, false).apply {
ivStyle.setPadding(6.dp, 6.dp, 6.dp, 6.dp)
ivStyle.setText(null)
ivStyle.setColorFilter(textColor)
ivStyle.borderColor = textColor
ivStyle.setImageResource(R.drawable.ic_add)
root.onClick {
ReadBookConfig.configList.add(ReadBookConfig.Config())
showBgTextConfig(ReadBookConfig.configList.lastIndex)
}
}
}
}

@ -39,12 +39,12 @@ class RssAdapter(context: Context, val callBack: CallBack) :
override fun registerListener(holder: ItemViewHolder, binding: ItemRssBinding) {
binding.apply {
root.onClick {
getItem(holder.layoutPosition)?.let {
getItemByLayoutPosition(holder.layoutPosition)?.let {
callBack.openRss(it)
}
}
root.onLongClick {
getItem(holder.layoutPosition)?.let {
getItemByLayoutPosition(holder.layoutPosition)?.let {
showMenu(ivIcon, it)
}
true

@ -10,6 +10,7 @@ import io.legado.app.R
import io.legado.app.base.VMBaseFragment
import io.legado.app.data.entities.RssSource
import io.legado.app.databinding.FragmentRssBinding
import io.legado.app.databinding.ItemRssBinding
import io.legado.app.lib.theme.ATH
import io.legado.app.ui.rss.article.RssSortActivity
import io.legado.app.ui.rss.favorites.RssFavoritesActivity
@ -52,6 +53,12 @@ class RssFragment : VMBaseFragment<RssSourceViewModel>(R.layout.fragment_rss),
ATH.applyEdgeEffectColor(binding.recyclerView)
adapter = RssAdapter(requireContext(), this)
binding.recyclerView.adapter = adapter
adapter.addHeaderView {
ItemRssBinding.inflate(layoutInflater, it, false).apply {
tvName.text = "订阅源"
ivIcon.setImageResource(R.mipmap.ic_launcher)
}
}
}
private fun initData() {

@ -71,7 +71,9 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
}
refreshRecyclerView.recyclerView.adapter = adapter
loadMoreView = LoadMoreView(requireContext())
adapter.addFooterView(ViewLoadMoreBinding.bind(loadMoreView))
adapter.addFooterView {
ViewLoadMoreBinding.bind(loadMoreView)
}
refreshRecyclerView.onRefreshStart = {
activityViewModel.rssSource?.let {
viewModel.loadContent(it)

Loading…
Cancel
Save