package com.marverenic.music.adapter; import android.support.v4.util.ArrayMap; import android.view.ViewGroup; import com.marverenic.adapter.DragDropAdapter; import com.marverenic.adapter.EnhancedViewHolder; import com.marverenic.adapter.HeterogeneousAdapter; import com.marverenic.music.R; import com.marverenic.music.model.Song; import java.util.ArrayList; import java.util.List; import java.util.Map; public abstract class EditableSongSection extends DragDropAdapter.DragSection<Song> { protected List<Song> mData; private final List<Integer> mIds; public EditableSongSection(List<Song> data) { mIds = new ArrayList<>(); setData(data); } public void setData(List<Song> data) { mData = data; buildIdMap(); } private void buildIdMap() { mIds.clear(); Map<Song, Integer> occurrences = new ArrayMap<>(); for (Song song : mData) { Integer count = occurrences.get(song); if (count == null) { count = 0; } int id = (int) (song.getSongId() * Math.pow(7, count)); mIds.add(id); occurrences.put(song, ++count); } } public List<Song> getData() { return mData; } @Override public int getId(int position) { return mIds.get(position); } @Override public int getDragHandleId() { return R.id.handle; } @Override protected void onDrag(int from, int to) { // Avoid the array copy in ArrayList by swapping the items manually // Since the difference between from and to is never more than 1, we don't have // to worry about shifting other items in the List's backing array Song fromObject = mData.get(from); Song toObject = mData.get(to); mData.set(to, fromObject); mData.set(from, toObject); Integer fromId = mIds.get(from); Integer toId = mIds.get(to); mIds.set(to, fromId); mIds.set(from, toId); } @Override protected abstract void onDrop(int from, int to); @Override public abstract EnhancedViewHolder<Song> createViewHolder(HeterogeneousAdapter adapter, ViewGroup parent); @Override public int getItemCount(HeterogeneousAdapter adapter) { return mData.size(); } @Override public Song get(int position) { return mData.get(position); } }