Fix broken adapter behaviour

This commit is contained in:
Phillip Thelen 2022-07-13 12:29:44 +02:00
parent 22b0b4f8a0
commit f586288c21
8 changed files with 20 additions and 21 deletions

View file

@ -123,7 +123,6 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainViewModel>() {
) )
viewModel.user.observe(this) { user -> viewModel.user.observe(this) { user ->
adapter.title = user.profile?.name ?: "" adapter.title = user.profile?.name ?: ""
adapter.notifyItemChanged(0)
val index = adapter.data.indexOfFirst { it.identifier == "stats" } val index = adapter.data.indexOfFirst { it.identifier == "stats" }
adapter.data[index].detailText = getString(R.string.user_level, user.stats?.lvl ?: 0) adapter.data[index].detailText = getString(R.string.user_level, user.stats?.lvl ?: 0)
adapter.notifyItemChanged(index+1) adapter.notifyItemChanged(index+1)

View file

@ -32,6 +32,7 @@ class SettingsActivity: BaseActivity<ActivitySettingsBinding, SettingsViewModel>
} }
adapter.data = buildSettings() adapter.data = buildSettings()
adapter.title = getString(R.string.settings)
lifecycleScope.launch { lifecycleScope.launch {
appStateManager.isAppConnected.collect { appStateManager.isAppConnected.collect {
adapter.isDisconnected = !it adapter.isDisconnected = !it
@ -49,13 +50,6 @@ class SettingsActivity: BaseActivity<ActivitySettingsBinding, SettingsViewModel>
private fun buildSettings(): List<SettingsItem> { private fun buildSettings(): List<SettingsItem> {
return listOf( return listOf(
SettingsItem(
"header",
getString(R.string.settings),
SettingsItem.Types.HEADER,
null
) {
},
SettingsItem( SettingsItem(
"sync", "sync",
getString(R.string.sync_data), getString(R.string.sync_data),

View file

@ -10,6 +10,11 @@ import com.habitrpg.wearos.habitica.ui.viewHolders.SpacerViewHolder
abstract class BaseAdapter<D: Any> : RecyclerView.Adapter<RecyclerView.ViewHolder >() { abstract class BaseAdapter<D: Any> : RecyclerView.Adapter<RecyclerView.ViewHolder >() {
var title: String = "" var title: String = ""
set(value) {
val previous = field
field = value
notifyItemChanged(0)
}
var onRefresh: (() -> Unit)? = null var onRefresh: (() -> Unit)? = null
var isDisconnected = false var isDisconnected = false
set(value) { set(value) {
@ -31,13 +36,8 @@ abstract class BaseAdapter<D: Any> : RecyclerView.Adapter<RecyclerView.ViewHolde
} }
} }
override fun getItemCount(): Int { override fun getItemCount() = data.size + 1
var count = data.size protected fun getItemAt(position: Int) = data[position - 1]
if (title.isNotBlank()) {
count++
}
return count
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is HeaderViewHolder) { if (holder is HeaderViewHolder) {

View file

@ -19,13 +19,12 @@ class HubAdapter: BaseAdapter<MenuItem>() {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is HubViewHolder) { if (holder is HubViewHolder) {
holder.bind(getItemAt(position - 1)) holder.bind(getItemAt(position))
} else { } else {
super.onBindViewHolder(holder, position) super.onBindViewHolder(holder, position)
} }
} }
private fun getItemAt(position: Int) = data.filter { !it.isHidden }[position]
override fun getItemViewType(position: Int) = if (position == 0) TYPE_HEADER else 1 override fun getItemViewType(position: Int) = if (position == 0) TYPE_HEADER else 1
} }

View file

@ -29,10 +29,10 @@ class SettingsAdapter: BaseAdapter<SettingsItem>() {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) { when (holder) {
is SettingsViewHolder -> { is SettingsViewHolder -> {
holder.bind(data[position]) holder.bind(getItemAt(position))
} }
is FooterViewHolder -> { is FooterViewHolder -> {
holder.bind(data[position].title) holder.bind(getItemAt(position).title)
} }
is SpacerViewHolder -> { is SpacerViewHolder -> {
holder.bind(16.dpToPx(holder.itemView.context)) holder.bind(16.dpToPx(holder.itemView.context))
@ -42,7 +42,8 @@ class SettingsAdapter: BaseAdapter<SettingsItem>() {
} }
override fun getItemViewType(position: Int): Int { override fun getItemViewType(position: Int): Int {
val item = data[position] if (position == 0) return TYPE_HEADER
val item = getItemAt(position)
return when (item.type) { return when (item.type) {
SettingsItem.Types.HEADER -> TYPE_HEADER SettingsItem.Types.HEADER -> TYPE_HEADER
SettingsItem.Types.FOOTER -> 1 SettingsItem.Types.FOOTER -> 1

View file

@ -23,7 +23,7 @@ open class TaskListAdapter : BaseAdapter<Any>() {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is TaskViewHolder) { if (holder is TaskViewHolder) {
val item = data[position - 1] as Task val item = getItemAt(position) as Task
holder.bind(item) holder.bind(item)
holder.onTaskScore = { holder.onTaskScore = {
onTaskScore?.invoke(item) onTaskScore?.invoke(item)

View file

@ -17,6 +17,7 @@ class HabiticaRecyclerView @JvmOverloads constructor(
post { post {
setPadding(0, (height * 0.1).toInt(), 0, (height * 0.25).toInt()) setPadding(0, (height * 0.1).toInt(), 0, (height * 0.25).toInt())
scrollToPosition(0) scrollToPosition(0)
requestFocus()
} }
} }

View file

@ -11,6 +11,11 @@ class HabiticaScrollView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null context: Context, attrs: AttributeSet? = null
) : NestedScrollView(context, attrs) { ) : NestedScrollView(context, attrs) {
override fun onAttachedToWindow() {
super.onAttachedToWindow()
requestFocus()
}
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
super.onLayout(changed, l, t, r, b) super.onLayout(changed, l, t, r, b)
if (changed) { if (changed) {