DragLinearLayout

by justasm

Android LinearLayout with drag and drop to reorder.

432 Stars 119 Forks Last release: over 5 years ago (v1.1.0) MIT License 60 Commits 1 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

DragLinearLayout

Dragging and swapping children views.

An Android

LinearLayout
that supports draggable and swappable child
View
s.

Why?

Why bother doing drag & swap in a

LinearLayout
when there are so many solutions for
ListView
?
  1. Simplicity - no need for
    ListAdapter
    s. 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:

<textview android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/text"></textview>

<imageview android:layout_width="match_parent" android:layout_height="120dp" android:scaletype="centerCrop" android:src="@drawable/image"></imageview>

<button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/button_text"></button>

</com.jmedeisis.draglinearlayout.draglinearlayout>

Enabling drag & swap for all child views:

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

Use

#addDragView(View, View)
,
#addDragView(View, View, int)
and
#removeDragView(View)
to manage draggable children dynamically:
final View view = 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
View
s:
dragLinearLayout.setOnViewSwapListener(new DragLinearLayout.OnViewSwapListener() {
    @Override
    public void onSwap(View firstView, int firstPosition,
            View secondView, int secondPosition) {
        // 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.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.