diff options
Diffstat (limited to 'app/src/main/java/net/lacolaco/smileessence/view/adapter/PageListAdapter.kt')
-rw-r--r-- | app/src/main/java/net/lacolaco/smileessence/view/adapter/PageListAdapter.kt | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/view/adapter/PageListAdapter.kt b/app/src/main/java/net/lacolaco/smileessence/view/adapter/PageListAdapter.kt new file mode 100644 index 00000000..34d158f0 --- /dev/null +++ b/app/src/main/java/net/lacolaco/smileessence/view/adapter/PageListAdapter.kt @@ -0,0 +1,110 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2012-2014 lacolaco.net + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package net.lacolaco.smileessence.view.adapter + +import android.os.Bundle +import android.support.v13.app.FragmentPagerAdapter +import net.lacolaco.smileessence.activity.MainActivity +import net.lacolaco.smileessence.logging.Logger +import net.lacolaco.smileessence.view.page.PageFragment + +import java.lang.ref.WeakReference +import java.util.ArrayList +import java.util.HashMap + +class PageListAdapter +// --------------------------- FragmentPagerAdapter --------------------------- + +(_activity: MainActivity) : FragmentPagerAdapter(_activity.fragmentManager) { + + // ------------------------------ FIELDS ------------------------------ + + private val pages = ArrayList<PageInfo>() + private val fragmentCache = HashMap<Int, WeakReference<PageFragment<*>>>() + + @Synchronized override fun getItem(position: Int): PageFragment<*> { + val pf: PageFragment<*> + val info = pages[position] + try { + pf = info.fragmentClass.newInstance() + } catch (e: Exception) { + Logger.error("should not happen: fragmentClass is private or Android is broken?") + e.printStackTrace() + throw RuntimeException(e) + } + + pf.arguments = info.args + fragmentCache.put(position, WeakReference(pf)) + return pf + } + + @Synchronized + fun getCachedFragment(pos: Int): PageFragment<*>? { + val wpf = fragmentCache[pos] + return wpf?.get() + } + + @Synchronized override fun getCount(): Int { + return pages.size + } + + // ------------------------ INTERFACE METHODS ------------------------ + + // -------------------------- OTHER METHODS -------------------------- + + fun addPage(klass: Class<out PageFragment<*>>, name: String, args: Bundle) { + this.addPage(klass, name, args, true) + } + + fun addPage(klass: Class<out PageFragment<*>>, name: String, args: Bundle, notifyChanged: Boolean) { + pages.add(PageInfo(klass, name, args)) + if (notifyChanged) notifyDataSetChanged() + } + + @Synchronized + fun removePage(position: Int): Boolean { + //if (removePageWithoutNotify(position)) { + // refreshListNavigation(); + // return true; + //} + return pages.removeAt(position) != null // TODO + } + + fun getName(pos: Int): String { + return pages[pos].name + } + + @Deprecated("") + fun getIndex(fragmentClass: Class<out PageFragment<*>>): Int { + for (i in pages.indices) { + if (pages[i].fragmentClass == fragmentClass) { + return i + } + } + return -1 + } + + private class PageInfo internal constructor(val fragmentClass: Class<out PageFragment<*>>, val name: String, val args: Bundle) +} |