From eb25fda5f665067404778586f9eff8bf3155b167 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 15 Aug 2016 22:10:14 +0200 Subject: [PATCH] try implementing multiple choicemode on recyclerview --- app/build.gradle | 1 + .../applauncher/activities/MainActivity.kt | 2 +- .../applauncher/adapters/RecyclerAdapter.kt | 52 +++++++++++++++---- 3 files changed, 44 insertions(+), 11 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9941648..e912204 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,6 +30,7 @@ dependencies { compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support:recyclerview-v7:23.4.0' compile 'com.android.support:design:23.4.0' + compile 'com.bignerdranch.android:recyclerview-multiselect:0.2' compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } diff --git a/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt index 96a03fe..e87afd6 100644 --- a/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt +++ b/app/src/main/kotlin/com/simplemobiletools/applauncher/activities/MainActivity.kt @@ -54,7 +54,7 @@ class MainActivity : SimpleActivity(), AddAppDialog.AddLaunchersInterface { private fun setupLaunchers() { launchers = dbHelper.getLaunchers() - launchers_holder.adapter = RecyclerAdapter(applicationContext, launchers) { + launchers_holder.adapter = RecyclerAdapter(this, launchers) { val launchIntent = packageManager.getLaunchIntentForPackage(it.pkgName) if (launchIntent != null) { startActivity(launchIntent) diff --git a/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/RecyclerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/RecyclerAdapter.kt index 1cb5b59..8bb9e43 100644 --- a/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/RecyclerAdapter.kt +++ b/app/src/main/kotlin/com/simplemobiletools/applauncher/adapters/RecyclerAdapter.kt @@ -1,19 +1,44 @@ package com.simplemobiletools.applauncher.adapters -import android.content.Context +import android.app.Activity +import android.support.v7.app.AppCompatActivity +import android.support.v7.view.ActionMode import android.support.v7.widget.RecyclerView -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* +import com.bignerdranch.android.multiselector.ModalMultiSelectorCallback +import com.bignerdranch.android.multiselector.MultiSelector +import com.bignerdranch.android.multiselector.SwappingHolder import com.simplemobiletools.applauncher.R import com.simplemobiletools.applauncher.models.AppLauncher import kotlinx.android.synthetic.main.app_launcher_dialog_item.view.* -class RecyclerAdapter(val cxt: Context, val launchers: List, val itemClick: (AppLauncher) -> Unit) : +class RecyclerAdapter(val act: Activity, val launchers: List, val itemClick: (AppLauncher) -> Unit) : RecyclerView.Adapter() { + val multiSelector = MultiSelector() + + val deleteMode = object : ModalMultiSelectorCallback(multiSelector) { + override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean { + return false + } + + override fun onCreateActionMode(actionMode: ActionMode?, menu: Menu?): Boolean { + super.onCreateActionMode(actionMode, menu) + act.menuInflater.inflate(R.menu.cab, menu) + return true + } + } + + override fun onAttachedToRecyclerView(recyclerView: RecyclerView?) { + super.onAttachedToRecyclerView(recyclerView) + if (multiSelector.isSelectable) { + deleteMode.setClearOnPrepare(false) + (act as AppCompatActivity).startSupportActionMode(deleteMode) + } + } + override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bindView(cxt, launchers[position]) + holder.bindView(act, deleteMode, multiSelector, launchers[position]) } override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder { @@ -25,19 +50,26 @@ class RecyclerAdapter(val cxt: Context, val launchers: List, val it return launchers.count() } - class ViewHolder(view: View, val itemClick: (AppLauncher) -> (Unit)) : RecyclerView.ViewHolder(view) { - fun bindView(context: Context, launcher: AppLauncher) { + class ViewHolder(view: View, val itemClick: (AppLauncher) -> (Unit)) : SwappingHolder(view, MultiSelector()) { + val viewHolder = this + fun bindView(act: Activity, deleteMode: ModalMultiSelectorCallback, multiSelector: MultiSelector, launcher: AppLauncher) { with(launcher) { itemView.launcher_label.text = launcher.name itemView.setOnClickListener { itemClick(this) } + itemView.setOnLongClickListener { + (act as AppCompatActivity).startSupportActionMode(deleteMode) + multiSelector.setSelected(viewHolder, true) + true + } + if (launcher.iconId != 0) { - val icon = context.resources.getDrawable(launcher.iconId) + val icon = act.resources.getDrawable(launcher.iconId) itemView.launcher_icon.setImageDrawable(icon) } else { - val icon = context.packageManager.getApplicationIcon(launcher.pkgName) + val icon = act.packageManager.getApplicationIcon(launcher.pkgName) itemView.launcher_icon.setImageDrawable(icon) } }