/** * Temporarily removes a contact from the list for UI refresh. Stores data for this contact * in the back-up variable. * * @param index Position of the contact to be removed. */ public void popDragEntry(int index) { if (isIndexInBound(index)) { mDraggedEntry = mDragEntries.get(index); mDraggedEntryIndex = index; mDragEnteredEntryIndex = index; markDropArea(index); } }
@Override public void onDragHovered(int x, int y, View view) { if (view == null) { return; } final int itemIndex = mDragEntries.indexOf(getDragEntity(view)); if (mInDragging && mDragEnteredEntryIndex != itemIndex && isIndexInBound(itemIndex) && itemIndex > mTilesStartLimit && itemIndex < mTilesEndLimit) { markDropArea(itemIndex); } }
/** * Drops the temporarily removed contact to the desired location in the list. */ public void handleDrop() { if (mDraggedEntry != null) { if (isIndexInBound(mDragEnteredEntryIndex) && mDragEnteredEntryIndex != mDraggedEntryIndex) { mDropEntryIndex = mDragEnteredEntryIndex; mDragEntries.set(mDropEntryIndex, mDraggedEntry); cacheOffsetsForDataSetChange(); notifyDataSetChanged(); } else if (isIndexInBound(mDraggedEntryIndex)) { mDragEntries.remove(mDragEnteredEntryIndex); mDragEntries.add(mDraggedEntryIndex, mDraggedEntry); mDropEntryIndex = mDraggedEntryIndex; notifyDataSetChanged(); } mDraggedEntry = null; if (mDraggedEntryIndex != mDragEnteredEntryIndex) { mDragDropListener.onDataSetChangedForResult(mDragEntries); } } }
/** * Mark the tile as drop area by given the item index in {@link #mDragEntries}. * * @param itemIndex Position of the contact in {@link #mDragEntries}. */ private void markDropArea(int itemIndex) { if (mDraggedEntry != null && isIndexInBound(mDragEnteredEntryIndex) && isIndexInBound(itemIndex)) { cacheOffsetsForDataSetChange(); // Remove the old placeholder item and place the new placeholder item. final int oldIndex = mDragEnteredEntryIndex; mDragEntries.remove(mDragEnteredEntryIndex); mDragEnteredEntryIndex = itemIndex; mDragEntries.add(mDragEnteredEntryIndex, BLANK_ENTRY); BLANK_ENTRY.setId(mDraggedEntry.getId()); onDataSetChangedForAnimation(); notifyDataSetChanged(); } }
int position = firstVisiblePosition + i; if (!isIndexInBound(position)) { continue;
private void saveOffsets() { final int firstVisiblePosition = mDragDropListener.getDragDropListView().getFirstVisiblePosition(); for (int i = 0; i < mDragDropListener.getDragDropListView().getChildCount(); i++) { final View child = mDragDropListener.getDragDropListView().getChildAt(i); final int position = firstVisiblePosition + i; if (!isIndexInBound(position)) { continue; } final long itemId = getItemId(position); // Log.d(TAG, "Saving itemId: " + itemId + " for listview child " + i + " Top: " // + child.getTop() + " Left: " // + child.getLeft()); mItemIdTopMap.put(itemId, child.getTop()); mItemIdLeftMap.put(itemId, child.getLeft()); } }