From df288ae750676ff1c46b66bf16e840c5e7126b82 Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Fri, 20 Oct 2017 19:05:47 +0800 Subject: [PATCH] improved timeline --- .../adapter/ParcelableStatusesAdapter.kt | 30 +++++++++++---- .../source/CursorObjectTiledDataSource.kt | 15 -------- .../twidere/util/paging/DiffCallbacks.kt | 37 +++++++++++++++++++ 3 files changed, 59 insertions(+), 23 deletions(-) create mode 100644 twidere/src/main/kotlin/org/mariotaku/twidere/util/paging/DiffCallbacks.kt diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/ParcelableStatusesAdapter.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/ParcelableStatusesAdapter.kt index 97a33ead7..de33feb54 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/ParcelableStatusesAdapter.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/adapter/ParcelableStatusesAdapter.kt @@ -23,7 +23,8 @@ import android.arch.paging.PagedList import android.arch.paging.PagedListAdapterHelper import android.content.Context import android.support.v4.widget.Space -import android.support.v7.recyclerview.extensions.DiffCallback +import android.support.v7.recyclerview.extensions.ListAdapterConfig +import android.support.v7.util.ListUpdateCallback import android.support.v7.widget.RecyclerView import android.util.SparseBooleanArray import android.view.LayoutInflater @@ -53,6 +54,7 @@ import org.mariotaku.twidere.model.timeline.TimelineFilter import org.mariotaku.twidere.util.StatusAdapterLinkClickHandler import org.mariotaku.twidere.util.TwidereLinkify import org.mariotaku.twidere.util.Utils +import org.mariotaku.twidere.util.paging.DiffCallbacks import org.mariotaku.twidere.view.holder.* import org.mariotaku.twidere.view.holder.iface.IStatusViewHolder import java.util.* @@ -108,6 +110,7 @@ class ParcelableStatusesAdapter( var timelineFilter: TimelineFilter? = null set(value) { field = value + updateItemCount() notifyDataSetChanged() } @@ -120,17 +123,28 @@ class ParcelableStatusesAdapter( private val showingFullTextStates = SparseBooleanArray() - private var pagedStatusesHelper = PagedListAdapterHelper(this, object : DiffCallback() { - override fun areContentsTheSame(oldItem: ParcelableStatus, newItem: ParcelableStatus): Boolean { - return oldItem == newItem + private var pagedStatusesHelper = PagedListAdapterHelper(object : ListUpdateCallback { + override fun onInserted(position: Int, count: Int) { + updateItemCount() + notifyItemRangeInserted(position, count) } - override fun areItemsTheSame(oldItem: ParcelableStatus, newItem: ParcelableStatus): Boolean { - if (oldItem._id > 0 && newItem._id > 0) return oldItem._id == newItem._id - return oldItem == newItem + override fun onRemoved(position: Int, count: Int) { + updateItemCount() + notifyItemRangeRemoved(position, count) } - }) + override fun onMoved(fromPosition: Int, toPosition: Int) { + updateItemCount() + notifyItemMoved(fromPosition, toPosition) + } + + override fun onChanged(position: Int, count: Int, payload: Any?) { + updateItemCount() + notifyItemRangeChanged(position, count, payload) + } + + }, ListAdapterConfig.Builder().setDiffCallback(DiffCallbacks.status).build()) var statuses: PagedList? get() = pagedStatusesHelper.currentList diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/data/source/CursorObjectTiledDataSource.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/data/source/CursorObjectTiledDataSource.kt index 11734a25e..6c6fab404 100644 --- a/twidere/src/main/kotlin/org/mariotaku/twidere/data/source/CursorObjectTiledDataSource.kt +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/data/source/CursorObjectTiledDataSource.kt @@ -21,11 +21,9 @@ package org.mariotaku.twidere.data.source import android.arch.paging.TiledDataSource import android.content.ContentResolver -import android.database.ContentObserver import android.net.Uri import android.os.Handler import android.os.Looper -import org.mariotaku.ktextension.weak import org.mariotaku.twidere.extension.queryAll import org.mariotaku.twidere.extension.queryCount @@ -43,19 +41,6 @@ class CursorObjectTiledDataSource( val cls: Class ) : TiledDataSource() { - init { - val weakThis = weak() - val observer = object : ContentObserver(MainHandler) { - override fun onChange(selfChange: Boolean) { - weakThis.get()?.invalidate() - } - } - addInvalidatedCallback cb@ { - resolver.unregisterContentObserver(observer) - } - resolver.registerContentObserver(uri, false, observer) - } - override fun countItems() = resolver.queryCount(uri, selection, selectionArgs) override fun loadRange(startPosition: Int, count: Int): List { diff --git a/twidere/src/main/kotlin/org/mariotaku/twidere/util/paging/DiffCallbacks.kt b/twidere/src/main/kotlin/org/mariotaku/twidere/util/paging/DiffCallbacks.kt new file mode 100644 index 000000000..e73cd0efe --- /dev/null +++ b/twidere/src/main/kotlin/org/mariotaku/twidere/util/paging/DiffCallbacks.kt @@ -0,0 +1,37 @@ +/* + * Twidere - Twitter client for Android + * + * Copyright (C) 2012-2017 Mariotaku Lee + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.mariotaku.twidere.util.paging + +import android.support.v7.recyclerview.extensions.DiffCallback +import org.mariotaku.twidere.model.ParcelableStatus + +object DiffCallbacks { + val status: DiffCallback = object : DiffCallback() { + override fun areContentsTheSame(oldItem: ParcelableStatus, newItem: ParcelableStatus): Boolean { + return oldItem == newItem + } + + override fun areItemsTheSame(oldItem: ParcelableStatus, newItem: ParcelableStatus): Boolean { + if (oldItem._id > 0 && newItem._id > 0) return oldItem._id == newItem._id + return oldItem == newItem + } + + } +} \ No newline at end of file