Saved searches internal improvements, lag is now fixed

This commit is contained in:
Jobobby04 2020-06-20 16:53:09 -04:00
parent 9e52f4e8cc
commit 7ce36f25ce
5 changed files with 126 additions and 66 deletions

View File

@ -0,0 +1,32 @@
package eu.kanade.tachiyomi.ui.browse.source.browse
import android.view.View
import com.google.android.material.chip.Chip
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.kanade.tachiyomi.databinding.SourceFilterSheetSavedSearchesBinding
import eu.kanade.tachiyomi.ui.base.holder.BaseFlexibleViewHolder
import eu.kanade.tachiyomi.util.view.gone
import eu.kanade.tachiyomi.util.view.visible
import timber.log.Timber
class SavedSearchesHolder(
view: View,
adapter: FlexibleAdapter<SavedSearchesItem>
) : BaseFlexibleViewHolder(view, adapter) {
var binding: SourceFilterSheetSavedSearchesBinding = SourceFilterSheetSavedSearchesBinding.bind(itemView)
fun setChips(chips: List<Chip> = emptyList()) {
Timber.d("Chips set")
binding.savedSearches.removeAllViews()
if (chips.isEmpty()) {
binding.savedSearchesTitle.gone()
} else {
binding.savedSearchesTitle.visible()
}
chips.forEach {
Timber.d(it.text.toString())
binding.savedSearches.addView(it)
}
}
}

View File

@ -0,0 +1,43 @@
package eu.kanade.tachiyomi.ui.browse.source.browse
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.davidea.flexibleadapter.items.AbstractFlexibleItem
import eu.davidea.flexibleadapter.items.IFlexible
import eu.kanade.tachiyomi.R
class SavedSearchesItem :
AbstractFlexibleItem<SavedSearchesHolder>() {
override fun getLayoutRes(): Int {
return R.layout.source_filter_sheet_saved_searches
}
override fun isSelectable(): Boolean {
return false
}
override fun isSwipeable(): Boolean {
return false
}
override fun createViewHolder(view: View, adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>): SavedSearchesHolder {
return SavedSearchesHolder(view, adapter as FlexibleAdapter<SavedSearchesItem>)
}
override fun bindViewHolder(
adapter: FlexibleAdapter<IFlexible<RecyclerView.ViewHolder>>,
holder: SavedSearchesHolder,
position: Int,
payloads: MutableList<Any?>?
) {}
override fun equals(other: Any?): Boolean {
return (this === other)
}
override fun hashCode(): Int {
return this.hashCode()
}
}

View File

@ -3,9 +3,9 @@ package eu.kanade.tachiyomi.ui.browse.source.browse
import android.app.Activity
import android.content.Context
import android.util.AttributeSet
import android.util.TypedValue
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.MergeAdapter
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.chip.Chip
import eu.davidea.flexibleadapter.FlexibleAdapter
@ -13,14 +13,11 @@ import eu.davidea.flexibleadapter.items.IFlexible
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.util.view.gone
import eu.kanade.tachiyomi.util.view.inflate
import eu.kanade.tachiyomi.util.view.visible
import eu.kanade.tachiyomi.widget.SimpleNavigationView
import exh.EXHSavedSearch
import kotlinx.android.synthetic.main.source_filter_sheet.view.filter_btn
import kotlinx.android.synthetic.main.source_filter_sheet.view.reset_btn
import kotlinx.android.synthetic.main.source_filter_sheet.view.save_search_btn
import kotlinx.android.synthetic.main.source_filter_sheet.view.saved_searches
import kotlinx.android.synthetic.main.source_filter_sheet.view.saved_searches_title
class SourceFilterSheet(
activity: Activity,
@ -71,28 +68,31 @@ class SourceFilterSheet(
class FilterNavigationView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
SimpleNavigationView(context, attrs) {
// EXH -->
var onFilterClicked = {}
var onResetClicked = {}
// SY -->
var onSaveClicked = {}
var onSavedSearchClicked: (Int) -> Unit = {}
var onSavedSearchDeleteClicked: (Int, String) -> Unit = { _, _ -> }
// EXH <--
var onFilterClicked = {}
var onResetClicked = {}
var savedSearchesItem = SavedSearchesItem()
var savedSearchesAdapter: FlexibleAdapter<SavedSearchesItem> = FlexibleAdapter<SavedSearchesItem>(listOf(savedSearchesItem))
// SY <--
val adapter: FlexibleAdapter<IFlexible<*>> = FlexibleAdapter<IFlexible<*>>(null)
.setDisplayHeadersAtStartUp(true)
.setStickyHeaders(true)
init {
recycler.adapter = adapter
// SY -->
recycler.adapter = MergeAdapter(savedSearchesAdapter, adapter)
// SY <--
recycler.setHasFixedSize(true)
val view = inflate(R.layout.source_filter_sheet)
// SY -->
((view as ViewGroup).findViewById(R.id.source_filter_content) as ViewGroup).addView(recycler)
// SY <--
((view as ViewGroup).getChildAt(1) as ViewGroup).addView(recycler)
addView(view)
// SY -->
save_search_btn.setOnClickListener { onSaveClicked() }
@ -103,20 +103,10 @@ class SourceFilterSheet(
// EXH -->
fun setSavedSearches(searches: List<EXHSavedSearch>) {
saved_searches.removeAllViews()
val outValue = TypedValue()
context.theme.resolveAttribute(android.R.attr.selectableItemBackground, outValue, true)
save_search_btn.visibility = if (searches.size < MAX_SAVED_SEARCHES) View.VISIBLE else View.GONE
val chips: MutableList<Chip> = mutableListOf()
if (searches.isEmpty()) {
saved_searches_title.gone()
} else {
saved_searches_title.visible()
}
searches.withIndex().sortedBy { it.value.name }.forEach { (index, search) ->
searches.withIndex().sortedBy { it.value.name.toLowerCase() }.forEach { (index, search) ->
val chip = Chip(context).apply {
text = search.name
setOnClickListener { onSavedSearchClicked(index) }
@ -125,7 +115,11 @@ class SourceFilterSheet(
}
}
saved_searches.addView(chip)
chips += chip
}
savedSearchesAdapter.recyclerView.post {
(recycler.findViewHolderForAdapterPosition(0) as? SavedSearchesHolder)?.setChips(chips)
savedSearchesAdapter.expand(0)
}
}

View File

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
@ -65,46 +64,11 @@
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.core.widget.NestedScrollView
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/saved_searches_title"
style="@style/Theme.Widget.Chip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:visibility="gone"
android:text="@string/eh_saved_searches" />
<com.google.android.material.chip.ChipGroup
android:id="@+id/saved_searches"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
app:chipSpacingHorizontal="4dp" />
<FrameLayout
android:id="@+id/source_filter_content"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="top"
android:layout_weight="1"
android:paddingBottom="8dp" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
android:layout_height="0dp"
android:layout_gravity="top"
android:layout_weight="1"
android:paddingBottom="8dp" />
</LinearLayout>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.textview.MaterialTextView
android:id="@+id/saved_searches_title"
style="@style/Theme.Widget.Chip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:visibility="visible"
android:text="@string/eh_saved_searches" />
<com.google.android.material.chip.ChipGroup
android:id="@+id/saved_searches"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
app:chipSpacingHorizontal="4dp" />
</LinearLayout>