Java tutorial
/* * The MIT License (MIT) * * Copyright (c) 2015. ameron32 * * 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 com.ameron32.apps.tapnotes._trial._demo.fragment.expandable; import android.support.v4.util.Pair; import com.h6ah4i.android.widget.advrecyclerview.expandable.RecyclerViewExpandableItemManager; import com.h6ah4i.android.widget.advrecyclerview.swipeable.RecyclerViewSwipeManager; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class ExampleExpandableDataProvider extends AbstractExpandableDataProvider { private List<Pair<GroupData, List<ChildData>>> mData; // for undo group item private Pair<GroupData, List<ChildData>> mLastRemovedGroup; private int mLastRemovedGroupPosition = -1; // for undo child item private ChildData mLastRemovedChild; private long mLastRemovedChildParentGroupId = -1; private int mLastRemovedChildPosition = -1; public ExampleExpandableDataProvider() { final String groupItems = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; final String childItems = "abc"; mData = new LinkedList<>(); for (int i = 0; i < groupItems.length(); i++) { //noinspection UnnecessaryLocalVariable final long groupId = i; final String groupText = Character.toString(groupItems.charAt(i)); final int groupSwipeReaction = RecyclerViewSwipeManager.REACTION_CAN_SWIPE_LEFT | RecyclerViewSwipeManager.REACTION_CAN_SWIPE_RIGHT; final ConcreteGroupData group = new ConcreteGroupData(groupId, groupText, groupSwipeReaction); final List<ChildData> children = new ArrayList<>(); for (int j = 0; j < childItems.length(); j++) { final long childId = group.generateNewChildId(); final String childText = Character.toString(childItems.charAt(j)); final int childSwipeReaction = RecyclerViewSwipeManager.REACTION_CAN_SWIPE_LEFT | RecyclerViewSwipeManager.REACTION_CAN_SWIPE_RIGHT; children.add(new ConcreteChildData(childId, childText, childSwipeReaction)); } mData.add(new Pair<GroupData, List<ChildData>>(group, children)); } } @Override public int getGroupCount() { return mData.size(); } @Override public int getChildCount(int groupPosition) { return mData.get(groupPosition).second.size(); } @Override public GroupData getGroupItem(int groupPosition) { if (groupPosition < 0 || groupPosition >= getGroupCount()) { throw new IndexOutOfBoundsException("groupPosition = " + groupPosition); } return mData.get(groupPosition).first; } @Override public ChildData getChildItem(int groupPosition, int childPosition) { if (groupPosition < 0 || groupPosition >= getGroupCount()) { throw new IndexOutOfBoundsException("groupPosition = " + groupPosition); } final List<ChildData> children = mData.get(groupPosition).second; if (childPosition < 0 || childPosition >= children.size()) { throw new IndexOutOfBoundsException("childPosition = " + childPosition); } return children.get(childPosition); } @Override public void moveGroupItem(int fromGroupPosition, int toGroupPosition) { if (fromGroupPosition == toGroupPosition) { return; } final Pair<GroupData, List<ChildData>> item = mData.remove(fromGroupPosition); mData.add(toGroupPosition, item); } @Override public void moveChildItem(int fromGroupPosition, int fromChildPosition, int toGroupPosition, int toChildPosition) { if ((fromGroupPosition == toGroupPosition) && (fromChildPosition == toChildPosition)) { return; } final Pair<GroupData, List<ChildData>> fromGroup = mData.get(fromGroupPosition); final Pair<GroupData, List<ChildData>> toGroup = mData.get(toGroupPosition); final ConcreteChildData item = (ConcreteChildData) fromGroup.second.remove(fromChildPosition); if (toGroupPosition != fromGroupPosition) { // assign a new ID final long newId = ((ConcreteGroupData) toGroup.first).generateNewChildId(); item.setChildId(newId); } toGroup.second.add(toChildPosition, item); } @Override public void removeGroupItem(int groupPosition) { mLastRemovedGroup = mData.remove(groupPosition); mLastRemovedGroupPosition = groupPosition; mLastRemovedChild = null; mLastRemovedChildParentGroupId = -1; mLastRemovedChildPosition = -1; } @Override public void removeChildItem(int groupPosition, int childPosition) { mLastRemovedChild = mData.get(groupPosition).second.remove(childPosition); mLastRemovedChildParentGroupId = mData.get(groupPosition).first.getGroupId(); mLastRemovedChildPosition = childPosition; mLastRemovedGroup = null; mLastRemovedGroupPosition = -1; } @Override public long undoLastRemoval() { if (mLastRemovedGroup != null) { return undoGroupRemoval(); } else if (mLastRemovedChild != null) { return undoChildRemoval(); } else { return RecyclerViewExpandableItemManager.NO_EXPANDABLE_POSITION; } } private long undoGroupRemoval() { int insertedPosition; if (mLastRemovedGroupPosition >= 0 && mLastRemovedGroupPosition < mData.size()) { insertedPosition = mLastRemovedGroupPosition; } else { insertedPosition = mData.size(); } mData.add(insertedPosition, mLastRemovedGroup); mLastRemovedGroup = null; mLastRemovedGroupPosition = -1; return RecyclerViewExpandableItemManager.getPackedPositionForGroup(insertedPosition); } private long undoChildRemoval() { Pair<GroupData, List<ChildData>> group = null; int groupPosition = -1; // find the group for (int i = 0; i < mData.size(); i++) { if (mData.get(i).first.getGroupId() == mLastRemovedChildParentGroupId) { group = mData.get(i); groupPosition = i; break; } } if (group == null) { return RecyclerViewExpandableItemManager.NO_EXPANDABLE_POSITION; } int insertedPosition; if (mLastRemovedChildPosition >= 0 && mLastRemovedChildPosition < group.second.size()) { insertedPosition = mLastRemovedChildPosition; } else { insertedPosition = group.second.size(); } group.second.add(insertedPosition, mLastRemovedChild); mLastRemovedChildParentGroupId = -1; mLastRemovedChildPosition = -1; mLastRemovedChild = null; return RecyclerViewExpandableItemManager.getPackedPositionForChild(groupPosition, insertedPosition); } public static final class ConcreteGroupData extends GroupData { private final long mId; private final String mText; private final int mSwipeReaction; private boolean mPinnedToSwipeLeft; private long mNextChildId; ConcreteGroupData(long id, String text, int swipeReaction) { mId = id; mText = text; mSwipeReaction = swipeReaction; mNextChildId = 0; } @Override public long getGroupId() { return mId; } @Override public boolean isSectionHeader() { return false; } @Override public int getSwipeReactionType() { return mSwipeReaction; } @Override public String getText() { return mText; } @Override public void setPinnedToSwipeLeft(boolean pinnedToSwipeLeft) { mPinnedToSwipeLeft = pinnedToSwipeLeft; } @Override public boolean isPinnedToSwipeLeft() { return mPinnedToSwipeLeft; } public long generateNewChildId() { final long id = mNextChildId; mNextChildId += 1; return id; } } public static final class ConcreteChildData extends ChildData { private long mId; private final String mText; private final int mSwipeReaction; private boolean mPinnedToSwipeLeft; ConcreteChildData(long id, String text, int swipeReaction) { mId = id; mText = text; mSwipeReaction = swipeReaction; } @Override public long getChildId() { return mId; } @Override public int getSwipeReactionType() { return mSwipeReaction; } @Override public String getText() { return mText; } @Override public void setPinnedToSwipeLeft(boolean pinnedToSwipeLeft) { mPinnedToSwipeLeft = pinnedToSwipeLeft; } @Override public boolean isPinnedToSwipeLeft() { return mPinnedToSwipeLeft; } public void setChildId(long id) { this.mId = id; } } }