I had a pretty similar problem a while ago. I needed a page where I can reinstall recordings (music tracks). So here is my implementation:
My AllTracksFragment, which allows you to reorder tracks
public class AllTracksFragment extends SupportFragmentBase { DynamicListView allTracksListView; private ArrayList<Track> allTracksList = new ArrayList<>(); TracksListViewAdapter allTracksAdapter; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_all_tracks, container, false); setHasOptionsMenu(true); allTracksListView = (DynamicListView)rootView .findViewById(R.id.allTracksListView); Track track1 = new Track();
And the AllTracksFragment layout:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <com.myapp.views.DynamicListView android:id="@+id/allTracksListView" android:layout_marginTop="12dp" android:scrollbars="none" android:divider="@null" android:layout_width="match_parent" android:layout_height="wrap_content"/> </RelativeLayout>
TracksListViewAdapter (if necessary):
public final class TracksListViewAdapter extends BaseListViewArrayAdapter<PlayTrackView, Track> { // extended version of simple BaseAdapter final int INVALID_ID = -1; public TracksListViewAdapter(final List<Track> tracks) { super(tracks == null ? new ArrayList<Track>(0) : tracks); if (tracks != null) { for (int i = 0; i < tracks.size(); ++i) { mIdMap.put(tracks.get(i), i); } } } public PlayTrackView createNewView(final Context context, final int position) { return new PlayTrackView(context); // PlayTrackView - is an extension of FrameLayout } HashMap<Track, Integer> mIdMap = new HashMap<>(); @Override public long getItemId(int position) { if (position < 0 || position >= mIdMap.size()) { return INVALID_ID; } Track item = (Track) getItem(position); return mIdMap.get(item); } @Override public boolean hasStableIds() { return android.os.Build.VERSION.SDK_INT < 20; } }
PlayTrackView .java
public class PlayTrackView extends FrameLayout implements IItemDisplayer<Track> { public PlayTrackView(Context context) { super(context); LayoutInflater.from(context).inflate(R.layout.play_track_view, this); } public PlayTrackView(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.play_track_view, this); } public PlayTrackView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); LayoutInflater.from(context).inflate(R.layout.play_track_view, this); } @Override public void displayItem(Track track) { } }
Track .java
public class Track { public String trackId; public String trackName; }
Interface IItemDisplayer
public interface IItemDisplayer<TItem> { public void displayItem(TItem item); }
BaseListViewAdapter
BaseListViewArrayAdapter