From b33420cabbf755ec3ad5f9cb27ea60e695c2a984 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 1 Jul 2016 08:03:30 -0400 Subject: [PATCH 1/2] Replace ListView with RecyclerView --- .../ui/habits/list/ListHabitsRootView.java | 2 +- .../controllers/HabitCardListController.java | 2 +- .../list/model/HabitCardListAdapter.java | 71 +++++++---- .../habits/list/model/HabitCardListCache.java | 10 -- .../list/model/HabitCardViewHolder.java | 31 +++++ .../habits/list/views/HabitCardListView.java | 114 +++++++++--------- .../ui/habits/list/views/HabitCardView.java | 4 + 7 files changed, 141 insertions(+), 93 deletions(-) create mode 100644 app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardViewHolder.java diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsRootView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsRootView.java index d534098f7..e6b212297 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsRootView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsRootView.java @@ -141,6 +141,6 @@ public class ListHabitsRootView extends BaseRootView private void updateEmptyView() { llEmpty.setVisibility( - listAdapter.getCount() > 0 ? View.GONE : View.VISIBLE); + listAdapter.getItemCount() > 0 ? View.GONE : View.VISIBLE); } } diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java index b1137b6ad..0eb879702 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java @@ -190,7 +190,7 @@ public class HabitCardListController implements DragSortListView.DropListener, private void cancelSelection() { adapter.clearSelection(); - view.setDragEnabled(true); +// view.setDragEnabled(true); activeMode = new NormalMode(); if (selectionListener != null) selectionListener.onSelectionFinish(); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListAdapter.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListAdapter.java index 18496edec..40f7a764d 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListAdapter.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListAdapter.java @@ -20,8 +20,8 @@ package org.isoron.uhabits.ui.habits.list.model; import android.support.annotation.*; +import android.support.v7.widget.*; import android.view.*; -import android.widget.*; import org.isoron.uhabits.*; import org.isoron.uhabits.models.*; @@ -35,7 +35,8 @@ import java.util.*; * The data if fetched and cached by a {@link HabitCardListCache}. This adapter * also holds a list of items that have been selected. */ -public class HabitCardListAdapter extends BaseAdapter +public class HabitCardListAdapter + extends RecyclerView.Adapter implements HabitCardListCache.Listener { @NonNull @@ -61,6 +62,8 @@ public class HabitCardListAdapter extends BaseAdapter cache = new HabitCardListCache(allHabits); cache.setListener(this); cache.setCheckmarkCount(checkmarkCount); + + setHasStableIds(true); } public void cancelRefresh() @@ -78,7 +81,7 @@ public class HabitCardListAdapter extends BaseAdapter } @Override - public int getCount() + public int getItemCount() { return cache.getHabitCount(); } @@ -90,13 +93,37 @@ public class HabitCardListAdapter extends BaseAdapter * @return the item at given position * @throws IndexOutOfBoundsException if position is not valid */ - @Override + @Deprecated @NonNull public Habit getItem(int position) { return cache.getHabitByPosition(position); } + @Override + public HabitCardViewHolder onCreateViewHolder(ViewGroup parent, + int viewType) + { + if(listView == null) return null; + View view = listView.createCardView(); + return new HabitCardViewHolder(view); + } + + @Override + public void onBindViewHolder(@Nullable HabitCardViewHolder holder, int position) + { + if(holder == null) return; + if(listView == null) return; + + Habit habit = cache.getHabitByPosition(position); + int score = cache.getScore(habit.getId()); + int checkmarks[] = cache.getCheckmarks(habit.getId()); + boolean selected = this.selected.contains(habit); + + HabitCardView cardView = (HabitCardView) holder.itemView; + listView.bindCardView(cardView, habit, score, checkmarks, selected); + } + @Override public long getItemId(int position) { @@ -115,21 +142,21 @@ public class HabitCardListAdapter extends BaseAdapter return new LinkedList<>(selected); } - @Override - public View getView(int position, - @Nullable View view, - @Nullable ViewGroup parent) - { - if (listView == null) return null; - - Habit habit = cache.getHabitByPosition(position); - int score = cache.getScore(habit.getId()); - int checkmarks[] = cache.getCheckmarks(habit.getId()); - boolean selected = this.selected.contains(habit); - - return listView.buildCardView((HabitCardView) view, habit, score, - checkmarks, selected); - } +// @Override +// public View getView(int position, +// @Nullable View view, +// @Nullable ViewGroup parent) +// { +// if (listView == null) return null; +// +// Habit habit = cache.getHabitByPosition(position); +// int score = cache.getScore(habit.getId()); +// int checkmarks[] = cache.getCheckmarks(habit.getId()); +// boolean selected = this.selected.contains(habit); +// +// return listView.buildCardView((HabitCardView) view, habit, score, +// checkmarks, selected); +// } /** * Returns whether list of selected items is empty. @@ -203,12 +230,6 @@ public class HabitCardListAdapter extends BaseAdapter this.listView = listView; } - public void setShowArchived(boolean showArchived) - { - cache.setIncludeArchived(showArchived); - cache.refreshAllHabits(true); - } - /** * Selects or deselects the item at a given position. * diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java index e41789c14..e20d52653 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java @@ -102,16 +102,6 @@ public class HabitCardListCache implements CommandRunner.Listener return data.habits.size(); } - public boolean getIncludeArchived() - { - return includeArchived; - } - - public void setIncludeArchived(boolean includeArchived) - { - this.includeArchived = includeArchived; - } - @Nullable public Long getLastLoadTimestamp() { diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardViewHolder.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardViewHolder.java new file mode 100644 index 000000000..f64013ba3 --- /dev/null +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardViewHolder.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2016 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker 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. + * + * Loop Habit Tracker 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.isoron.uhabits.ui.habits.list.model; + +import android.support.v7.widget.*; +import android.view.*; + +public class HabitCardViewHolder extends RecyclerView.ViewHolder +{ + public HabitCardViewHolder(View itemView) + { + super(itemView); + } +} diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardListView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardListView.java index 52366774e..fb8dfc4ee 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardListView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardListView.java @@ -19,22 +19,19 @@ package org.isoron.uhabits.ui.habits.list.views; -import android.content.Context; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.util.AttributeSet; -import android.view.View; -import android.widget.ListAdapter; - -import com.mobeta.android.dslv.DragSortController; -import com.mobeta.android.dslv.DragSortListView; - -import org.isoron.uhabits.models.Habit; -import org.isoron.uhabits.ui.habits.list.controllers.CheckmarkButtonController; -import org.isoron.uhabits.ui.habits.list.controllers.HabitCardController; -import org.isoron.uhabits.ui.habits.list.model.HabitCardListAdapter; - -public class HabitCardListView extends DragSortListView +import android.content.*; +import android.support.annotation.*; +import android.support.v7.widget.*; +import android.util.*; +import android.view.*; + +import com.mobeta.android.dslv.*; + +import org.isoron.uhabits.models.*; +import org.isoron.uhabits.ui.habits.list.controllers.*; +import org.isoron.uhabits.ui.habits.list.model.*; + +public class HabitCardListView extends RecyclerView { @Nullable private HabitCardListAdapter adapter; @@ -45,9 +42,11 @@ public class HabitCardListView extends DragSortListView public HabitCardListView(Context context, AttributeSet attrs) { super(context, attrs); - setFloatViewManager(new ViewManager()); - setDragEnabled(true); +// setFloatViewManager(new ViewManager()); +// setDragEnabled(true); setLongClickable(true); + setHasFixedSize(true); + setLayoutManager(new LinearLayoutManager(getContext())); } /** @@ -63,14 +62,12 @@ public class HabitCardListView extends DragSortListView * @param selected true if the card is selected, false otherwise * @return the HabitCardView generated */ - public View buildCardView(@Nullable HabitCardView cardView, - @NonNull Habit habit, - int score, - int[] checkmarks, - boolean selected) + public View bindCardView(@NonNull HabitCardView cardView, + @NonNull Habit habit, + int score, + int[] checkmarks, + boolean selected) { - if (cardView == null) cardView = new HabitCardView(getContext()); - cardView.setHabit(habit); cardView.setSelected(selected); cardView.setCheckmarkValues(checkmarks); @@ -87,8 +84,13 @@ public class HabitCardListView extends DragSortListView return cardView; } + public View createCardView() + { + return new HabitCardView(getContext()); + } + @Override - public void setAdapter(ListAdapter adapter) + public void setAdapter(RecyclerView.Adapter adapter) { this.adapter = (HabitCardListAdapter) adapter; super.setAdapter(adapter); @@ -97,18 +99,18 @@ public class HabitCardListView extends DragSortListView public void setController(@Nullable Controller controller) { this.controller = controller; - setDropListener(controller); - setDragListener(controller); - setOnItemClickListener(null); +// setDropListener(controller); +// setDragListener(controller); +// setOnItemClickListener(null); setOnLongClickListener(null); if (controller == null) return; - setOnItemClickListener((p, v, pos, id) -> controller.onItemClick(pos)); - setOnItemLongClickListener((p, v, pos, id) -> { - controller.onItemLongClick(pos); - return true; - }); +// setOnItemClickListener((p, v, pos, id) -> controller.onItemClick(pos)); +// setOnItemLongClickListener((p, v, pos, id) -> { +// controller.onItemLongClick(pos); +// return true; +// }); } @Override @@ -127,32 +129,32 @@ public class HabitCardListView extends DragSortListView public interface Controller extends CheckmarkButtonController.Listener, HabitCardController.Listener, - DropListener, - DragListener + DragSortListView.DropListener, + DragSortListView.DragListener { void onItemClick(int pos); void onItemLongClick(int pos); } - private class ViewManager extends DragSortController - { - public ViewManager() - { - super(HabitCardListView.this); - setRemoveEnabled(false); - } - - @Override - public View onCreateFloatView(int position) - { - if (adapter == null) return null; - return adapter.getView(position, null, null); - } - - @Override - public void onDestroyFloatView(View floatView) - { - } - } +// private class ViewManager extends DragSortController +// { +// public ViewManager() +// { +// super(HabitCardListView.this); +// setRemoveEnabled(false); +// } +// +// @Override +// public View onCreateFloatView(int position) +// { +// if (adapter == null) return null; +// return adapter.getView(position, null, null); +// } +// +// @Override +// public void onDestroyFloatView(View floatView) +// { +// } +// } } diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardView.java index 6435d61af..f0a42680a 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardView.java @@ -88,6 +88,10 @@ public class HabitCardView extends FrameLayout checkmarkPanel.setController(null); if (controller == null) return; + setOnClickListener(v -> { + + }); + checkmarkPanel.setController(controller); } From 71dd6cde89d7c5e595d8d7709711283422f3464e Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 1 Jul 2016 09:23:07 -0400 Subject: [PATCH 2/2] Restore drag & drop and click; remove DragSortListView library --- app/build.gradle | 2 - .../models/sqlite/SQLiteHabitList.java | 36 +++---- .../ui/habits/list/ListHabitsController.java | 2 +- .../ui/habits/list/ListHabitsRootView.java | 2 +- .../controllers/HabitCardListController.java | 14 +-- .../list/model/HabitCardListAdapter.java | 3 +- .../habits/list/views/HabitCardListView.java | 99 +++++++++++-------- app/src/main/res/layout/list_habits.xml | 3 - .../HabitCardListControllerTest.java | 2 +- libs/drag-sort-listview | 1 - settings.gradle | 1 - 11 files changed, 79 insertions(+), 86 deletions(-) delete mode 160000 libs/drag-sort-listview diff --git a/app/build.gradle b/app/build.gradle index c446e6d11..9d688f8dd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -69,8 +69,6 @@ dependencies { androidTestApt 'com.google.dagger:dagger-compiler:2.2' provided 'javax.annotation:jsr250-api:1.0' - compile project(':libs:drag-sort-listview:library') - testCompile 'junit:junit:4.12' testCompile 'org.hamcrest:hamcrest-library:1.3' testCompile 'org.mockito:mockito-core:1.10.19' diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteHabitList.java b/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteHabitList.java index 7ced8ae6a..778ef02b4 100644 --- a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteHabitList.java +++ b/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteHabitList.java @@ -22,6 +22,7 @@ package org.isoron.uhabits.models.sqlite; import android.support.annotation.*; import com.activeandroid.query.*; +import com.activeandroid.util.*; import org.apache.commons.lang3.*; import org.isoron.uhabits.models.*; @@ -181,8 +182,16 @@ public class SQLiteHabitList extends HabitList { if (from == to) return; - Integer toPos = indexOf(to); - Integer fromPos = indexOf(from); + HabitRecord fromRecord = HabitRecord.get(from.getId()); + HabitRecord toRecord = HabitRecord.get(to.getId()); + + if (fromRecord == null) throw new RuntimeException("habit not in database"); + if (toRecord == null) throw new RuntimeException("habit not in database"); + + Integer fromPos = fromRecord.position; + Integer toPos = toRecord.position; + + Log.d("SQLiteHabitList", String.format("reorder: %d %d", fromPos, toPos)); if (toPos < fromPos) { @@ -199,10 +208,8 @@ public class SQLiteHabitList extends HabitList .execute(); } - HabitRecord record = HabitRecord.get(from.getId()); - if (record == null) throw new RuntimeException("habit not in database"); - record.position = toPos; - record.save(); + fromRecord.position = toPos; + fromRecord.save(); update(from); @@ -212,10 +219,6 @@ public class SQLiteHabitList extends HabitList @Override public int size() { -// SQLiteDatabase db = Cache.openDatabase(); -// SQLiteStatement st = db.compileStatement(buildCountQuery()); -// return (int) st.simpleQueryForLong(); - return toList().size(); } @@ -251,11 +254,6 @@ public class SQLiteHabitList extends HabitList return habits; } - private void appendCount(StringBuilder query) - { - query.append("select count (*) from habits "); - } - private void appendOrderBy(StringBuilder query) { query.append("order by position "); @@ -278,14 +276,6 @@ public class SQLiteHabitList extends HabitList query.append(" "); } - private String buildCountQuery() - { - StringBuilder query = new StringBuilder(); - appendCount(query); - appendWhere(query); - return query.toString(); - } - private String buildSelectQuery() { StringBuilder query = new StringBuilder(); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsController.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsController.java index 4383c7122..063f31ca1 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsController.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsController.java @@ -98,7 +98,7 @@ public class ListHabitsController @Override public void onHabitReorder(@NonNull Habit from, @NonNull Habit to) { - habitList.reorder(from, to); + new SimpleTask(() -> habitList.reorder(from, to)).execute(); } public void onImportData(@NonNull File file) diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsRootView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsRootView.java index e6b212297..4ff891f36 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsRootView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsRootView.java @@ -115,7 +115,7 @@ public class ListHabitsRootView extends BaseRootView @NonNull ListHabitsSelectionMenu menu) { HabitCardListController listController = - new HabitCardListController(listAdapter, listView); + new HabitCardListController(listAdapter); listController.setHabitListener(controller); listController.setSelectionListener(menu); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java index 0eb879702..fd0ba6778 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/controllers/HabitCardListController.java @@ -21,8 +21,6 @@ package org.isoron.uhabits.ui.habits.list.controllers; import android.support.annotation.*; -import com.mobeta.android.dslv.*; - import org.isoron.uhabits.models.*; import org.isoron.uhabits.ui.habits.list.model.*; import org.isoron.uhabits.ui.habits.list.views.*; @@ -32,9 +30,7 @@ import org.isoron.uhabits.ui.habits.list.views.*; * HabitListView. These include selecting and reordering items, toggling * checkmarks and clicking habits. */ -public class HabitCardListController implements DragSortListView.DropListener, - DragSortListView.DragListener, - HabitCardListView.Controller +public class HabitCardListController implements HabitCardListView.Controller { private final Mode NORMAL_MODE = new NormalMode(); @@ -43,9 +39,6 @@ public class HabitCardListController implements DragSortListView.DropListener, @NonNull private final HabitCardListAdapter adapter; - @NonNull - private final HabitCardListView view; - @Nullable private HabitListener habitListener; @@ -55,11 +48,9 @@ public class HabitCardListController implements DragSortListView.DropListener, @NonNull private Mode activeMode; - public HabitCardListController(@NonNull HabitCardListAdapter adapter, - @NonNull HabitCardListView view) + public HabitCardListController(@NonNull HabitCardListAdapter adapter) { this.adapter = adapter; - this.view = view; this.activeMode = new NormalMode(); } @@ -190,7 +181,6 @@ public class HabitCardListController implements DragSortListView.DropListener, private void cancelSelection() { adapter.clearSelection(); -// view.setDragEnabled(true); activeMode = new NormalMode(); if (selectionListener != null) selectionListener.onSelectionFinish(); diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListAdapter.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListAdapter.java index 40f7a764d..8fce97143 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListAdapter.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListAdapter.java @@ -121,7 +121,8 @@ public class HabitCardListAdapter boolean selected = this.selected.contains(habit); HabitCardView cardView = (HabitCardView) holder.itemView; - listView.bindCardView(cardView, habit, score, checkmarks, selected); + listView.bindCardView(cardView, habit, score, checkmarks, selected, + position); } @Override diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardListView.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardListView.java index fb8dfc4ee..0eb898e46 100644 --- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardListView.java +++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/views/HabitCardListView.java @@ -22,11 +22,10 @@ package org.isoron.uhabits.ui.habits.list.views; import android.content.*; import android.support.annotation.*; import android.support.v7.widget.*; +import android.support.v7.widget.helper.*; import android.util.*; import android.view.*; -import com.mobeta.android.dslv.*; - import org.isoron.uhabits.models.*; import org.isoron.uhabits.ui.habits.list.controllers.*; import org.isoron.uhabits.ui.habits.list.model.*; @@ -42,11 +41,12 @@ public class HabitCardListView extends RecyclerView public HabitCardListView(Context context, AttributeSet attrs) { super(context, attrs); -// setFloatViewManager(new ViewManager()); -// setDragEnabled(true); setLongClickable(true); setHasFixedSize(true); setLayoutManager(new LinearLayoutManager(getContext())); + + TouchHelperCallback callback = new TouchHelperCallback(); + new ItemTouchHelper(callback).attachToRecyclerView(this); } /** @@ -60,13 +60,15 @@ public class HabitCardListView extends RecyclerView * @param checkmarks the list of checkmark values to be included in the * card * @param selected true if the card is selected, false otherwise + * @param position * @return the HabitCardView generated */ public View bindCardView(@NonNull HabitCardView cardView, @NonNull Habit habit, int score, int[] checkmarks, - boolean selected) + boolean selected, + int position) { cardView.setHabit(habit); cardView.setSelected(selected); @@ -79,6 +81,12 @@ public class HabitCardListView extends RecyclerView cardController.setListener(controller); cardView.setController(cardController); cardController.setView(cardView); + + cardView.setOnClickListener(v -> controller.onItemClick(position)); + cardView.setOnLongClickListener(v -> { + controller.onItemLongClick(position); + return true; + }); } return cardView; @@ -99,18 +107,6 @@ public class HabitCardListView extends RecyclerView public void setController(@Nullable Controller controller) { this.controller = controller; -// setDropListener(controller); -// setDragListener(controller); -// setOnItemClickListener(null); - setOnLongClickListener(null); - - if (controller == null) return; - -// setOnItemClickListener((p, v, pos, id) -> controller.onItemClick(pos)); -// setOnItemLongClickListener((p, v, pos, id) -> { -// controller.onItemLongClick(pos); -// return true; -// }); } @Override @@ -128,33 +124,56 @@ public class HabitCardListView extends RecyclerView } public interface Controller extends CheckmarkButtonController.Listener, - HabitCardController.Listener, - DragSortListView.DropListener, - DragSortListView.DragListener + HabitCardController.Listener { + void drag(int from, int to); + + void drop(int from, int to); + void onItemClick(int pos); void onItemLongClick(int pos); + + void startDrag(int position); } -// private class ViewManager extends DragSortController -// { -// public ViewManager() -// { -// super(HabitCardListView.this); -// setRemoveEnabled(false); -// } -// -// @Override -// public View onCreateFloatView(int position) -// { -// if (adapter == null) return null; -// return adapter.getView(position, null, null); -// } -// -// @Override -// public void onDestroyFloatView(View floatView) -// { -// } -// } + class TouchHelperCallback extends ItemTouchHelper.Callback + { + @Override + public int getMovementFlags(RecyclerView recyclerView, + ViewHolder viewHolder) + { + int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; + int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; + return makeMovementFlags(dragFlags, swipeFlags); + } + + @Override + public boolean isLongPressDragEnabled() + { + return true; + } + + @Override + public boolean isItemViewSwipeEnabled() + { + return false; + } + + @Override + public boolean onMove(RecyclerView recyclerView, + ViewHolder from, + ViewHolder to) + { + if (controller == null) return false; + controller.drop(from.getAdapterPosition(), to.getAdapterPosition()); + return true; + } + + @Override + public void onSwiped(ViewHolder viewHolder, int direction) + { + // NOP + } + } } diff --git a/app/src/main/res/layout/list_habits.xml b/app/src/main/res/layout/list_habits.xml index 8e4781399..0eddf17f2 100644 --- a/app/src/main/res/layout/list_habits.xml +++ b/app/src/main/res/layout/list_habits.xml @@ -45,9 +45,6 @@ android:divider="?windowBackgroundColor" android:dividerHeight="1dp" android:listSelector="@android:color/transparent" - app:drag_start_mode="onLongPress" - app:sort_enabled="true" - app:track_drag_sort="false" android:layout_below="@id/header"/>