From 065e7a135b9817b94e397f7c21259699eb3b09be Mon Sep 17 00:00:00 2001 From: Kazuki Yamaguchi Date: Wed, 25 Oct 2017 00:33:45 +0900 Subject: pieee --- .../net/lacolaco/smileessence/util/SortedList.kt | 41 ++++++++++++++++++ .../smileessence/view/page/ListPageFragment.kt | 4 +- .../smileessence/view/page/MessagesPageFragment.kt | 4 +- .../smileessence/view/page/SearchPageFragment.kt | 6 +-- .../smileessence/view/page/TimelinePageFragment.kt | 48 ++++++---------------- .../smileessence/view/page/TweetsPageFragment.kt | 3 -- 6 files changed, 61 insertions(+), 45 deletions(-) create mode 100644 app/src/main/java/net/lacolaco/smileessence/util/SortedList.kt (limited to 'app/src/main/java/net/lacolaco') diff --git a/app/src/main/java/net/lacolaco/smileessence/util/SortedList.kt b/app/src/main/java/net/lacolaco/smileessence/util/SortedList.kt new file mode 100644 index 00000000..b0c0e205 --- /dev/null +++ b/app/src/main/java/net/lacolaco/smileessence/util/SortedList.kt @@ -0,0 +1,41 @@ +package net.lacolaco.smileessence.util + +import net.lacolaco.smileessence.entity.IdObject +import java.util.* + +class SortedList constructor( + private val onInserted: (Int) -> Unit, + private val onRemoved: (Int, Int) -> Unit, + initialCapacity: Int = 32 +) { + private var arrayList = ArrayList(initialCapacity) + + fun add(item: T): Int { + val pos = arrayList.binarySearchBy(item.id, selector = { it.id }) + if (pos >= 0) + return applyReversedOrder(pos) + arrayList.add(-pos - 1, item) + onInserted(applyReversedOrder(-pos - 1)) + return applyReversedOrder(-pos - 1) + } + + fun addAll(items: Collection) { + items.forEach { add(it) } + } + + operator fun get(index: Int): T { + return arrayList[applyReversedOrder(index)] + } + + fun clear() { + val size = arrayList.size + arrayList.clear() + onRemoved(0, size) + } + + val size + get() = arrayList.size + + private fun applyReversedOrder(pos: Int): Int + = arrayList.size - pos - 1 +} diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/ListPageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/ListPageFragment.kt index a226266e..492d241e 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/ListPageFragment.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/page/ListPageFragment.kt @@ -49,14 +49,14 @@ class ListPageFragment : RefreshableTimelinePageFragment 0) adapter.sortedList[0].id else null + val sinceId = if (adapter.sortedList.size > 0) adapter.sortedList[0].id else null runRefreshTask(world.getListTimelineAsync(pageInfo.fullName!!, sinceId = sinceId)) { view.isRefreshing = false } } override fun onSwipeUp(view: SwipyRefreshLayout) { - val maxId = if (adapter.sortedList.size() > 0) adapter.sortedList[adapter.sortedList.size() - 1].id - 1 else null + val maxId = if (adapter.sortedList.size > 0) adapter.sortedList[adapter.sortedList.size - 1].id - 1 else null runRefreshTask(world.getListTimelineAsync(pageInfo.fullName!!, maxId = maxId)) { view.isRefreshing = false } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/MessagesPageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/MessagesPageFragment.kt index aa5d9b20..7ca61030 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/MessagesPageFragment.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/page/MessagesPageFragment.kt @@ -36,14 +36,14 @@ class MessagesPageFragment : RefreshableTimelinePageFragment 0) adapter.sortedList[0].id else null + val sinceId = if (adapter.sortedList.size > 0) adapter.sortedList[0].id else null runRefreshTask(world.getReceivedMessagesAsync(sinceId = sinceId)) { view.isRefreshing = false } } override fun onSwipeUp(view: SwipyRefreshLayout) { - val maxId = if (adapter.sortedList.size() > 0) adapter.sortedList[adapter.sortedList.size() - 1].id - 1 else null + val maxId = if (adapter.sortedList.size > 0) adapter.sortedList[adapter.sortedList.size - 1].id - 1 else null runRefreshTask(world.getReceivedMessagesAsync(maxId = maxId)) { view.isRefreshing = false } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/SearchPageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/SearchPageFragment.kt index 74c70c35..9491eb05 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/SearchPageFragment.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/page/SearchPageFragment.kt @@ -108,7 +108,7 @@ class SearchPageFragment : RefreshableTimelinePageFragment 0) { + if (adapter.sortedList.size > 0) { query.sinceId = adapter.sortedList[0].id } runRefreshTask(query) { @@ -121,8 +121,8 @@ class SearchPageFragment : RefreshableTimelinePageFragment 0) { - query.maxId = adapter.sortedList[adapter.sortedList.size() - 1].id - 1 + if (adapter.sortedList.size > 0) { + query.maxId = adapter.sortedList[adapter.sortedList.size - 1].id - 1 } runRefreshTask(query) { view.isRefreshing = false diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/TimelinePageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/TimelinePageFragment.kt index a7ee5602..6daa1ac0 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/TimelinePageFragment.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/page/TimelinePageFragment.kt @@ -1,20 +1,27 @@ package net.lacolaco.smileessence.view.page import android.os.Bundle -import android.support.v7.util.SortedList import android.support.v7.widget.DividerItemDecoration import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.RecyclerView +import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import kotlinx.android.synthetic.main.page_fragment_timeline.* +import net.lacolaco.smileessence.R import net.lacolaco.smileessence.data.PageInfo import net.lacolaco.smileessence.entity.IdObject +import net.lacolaco.smileessence.util.SortedList abstract class TimelinePageFragment : PageFragment() { protected val adapter = TimelineAdapter() private var adapterDataObserver: RecyclerView.AdapterDataObserver? = null + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, + savedInstanceState: Bundle?): View { + return inflater.inflate(R.layout.page_fragment_timeline, container, false) + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -48,39 +55,10 @@ abstract class TimelinePageFragment : PageFragm abstract fun onCreateItemView(parent: ViewGroup): View protected inner class TimelineAdapter : RecyclerView.Adapter() { - val sortedList = SortedList(IdObject::class.java, object : SortedList.Callback() { - override fun areItemsTheSame(item1: IdObject, item2: IdObject): Boolean { - return item1 === item2 - } - - override fun onInserted(position: Int, count: Int) { - notifyItemRangeInserted(position, count) - } - - override fun onChanged(position: Int, count: Int) { - notifyItemRangeChanged(position, count) - } - - override fun onMoved(fromPosition: Int, toPosition: Int) { - notifyItemMoved(fromPosition, toPosition) - } - - override fun areContentsTheSame(oldItem: IdObject, newItem: IdObject): Boolean { - return oldItem === newItem - } - - override fun onRemoved(position: Int, count: Int) { - notifyItemRangeRemoved(position, count) - } - - override fun compare(o1: IdObject, o2: IdObject): Int { - if (o1.id < o2.id) - return 1 - if (o1.id > o2.id) - return -1 - return 0 - } - }) + val sortedList = SortedList( + { position -> notifyItemInserted(position) }, + { position, count -> notifyItemRangeRemoved(position, count) } + ) override fun onBindViewHolder(holder: ViewHolder, position: Int) { @Suppress("UNCHECKED_CAST") @@ -92,7 +70,7 @@ abstract class TimelinePageFragment : PageFragm } override fun getItemCount(): Int { - return sortedList.size() + return sortedList.size } inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/TweetsPageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/TweetsPageFragment.kt index 60388d21..0b445e12 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/TweetsPageFragment.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/page/TweetsPageFragment.kt @@ -14,14 +14,11 @@ class TweetsPageFragment : TimelinePageFragment( override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - // World::addTimeline() performs backfill if necessary - adapter.sortedList.beginBatchedUpdates() val patterns = pageInfo.patterns world.addTimeline(this) { tweet -> if (patterns.any { it.containsMatchIn(tweet.originalTweet.text) }) launchUi { adapter.sortedList.add(tweet) } } - adapter.sortedList.endBatchedUpdates() } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle?): View { -- cgit v1.2.3