Skip to content

Repository files navigation

DragLinearLayout

Dragging and swapping children views.

An Android LinearLayout that supports draggable and swappable child Views.

Why?

Why bother doing drag & swap in a LinearLayoutwhenthere areso manysolutions for ListView?

  1. Simplicity - no need for ListAdapters. By default, works like a LinearLayout.
  2. Flexibility - supports heterogeneous, selectively draggable (or not draggable), children.
  3. Portability - can be used in any layout, e.g. as a child in a ScrollView container.

Usage

Add it to your project using Gradle:

compile 'com.jmedeisis:draglinearlayout:1.1.0'

The DragLinearLayout can be used in place of any LinearLayout. However, by default, children will not be draggable. To set an existing View as draggable, use DragLinearLayout#setViewDraggable(View, View), passing in the child View and a (non-null!) View that will act as the handle for dragging it (this can be the View itself).

XML layout file:

<com.jmedeisis.draglinearlayout.DragLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/container"android:layout_width="match_parent"android:layout_height="match_parent" >
<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/text" />
<ImageViewandroid:layout_width="match_parent"android:layout_height="120dp"android:scaleType="centerCrop"android:src="@drawable/image"/>
<Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/button_text"/>
</com.jmedeisis.draglinearlayout.DragLinearLayout>

Enabling drag & swap for all child views:

DragLinearLayoutdragLinearLayout = (DragLinearLayout) findViewById(R.id.container);
for(inti = 0; i < dragLinearLayout.getChildCount(); i++){
Viewchild = dragLinearLayout.getChildAt(i);
// the child will act as its own drag handledragLinearLayout.setViewDraggable(child, child);
}

Use #addDragView(View, View),#addDragView(View, View, int) and #removeDragView(View) to manage draggable children dynamically:

finalViewview = View.inflate(context, R.layout.view_layout, null);
dragLinearLayout.addDragView(view, view.findViewById(R.id.view_drag_handle));
// ..dragLinearLayout.removeDragView(view);

Attach an OnViewSwapListener with #setOnViewSwapListener(OnViewSwapListener) to detect changes to the ordering of child Views:

dragLinearLayout.setOnViewSwapListener(newDragLinearLayout.OnViewSwapListener() {
@OverridepublicvoidonSwap(ViewfirstView, intfirstPosition,
ViewsecondView, intsecondPosition) {
// update data, etc..
}
});

When placing the DragLinearLayout inside a ScrollView, call #setContainerScrollView(ScrollView) to enable the user to scroll while dragging a child view.

For best visual results, use children that have opaque backgrounds. Furthermore, do not use horizontal padding for the DragLinearLayout; instead, let children apply their own horizontal padding.

Refer to the included sample activity project for a demonstration of the above usage techniques and more.

Limitations

  • Supports only the LinearLayout#VERTICAL orientation.

License

This project is licensed under the terms of the MIT license. You may find a copy of the license in the included LICENSE file.

About

Android LinearLayout with drag and drop to reorder.

Resources

Stars

455 stars

Watchers

14 watching

Forks

Releases

Packages

Used by

Contributors

Languages