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

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

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

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

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

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

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

Loading…
Cancel
Save