Drag and drop to reorder items in a list, grid or board for Android. Based on RecyclerView. Also supports swiping items in a list.

Related tags

UI/UX DragListView
Overview

DragListView

DragListView can be used when you want to be able to re-order items in a list, grid or a board. It also supports horizontal swiping of items in a list.

YouTube demo video
Android drag and drop list and board

Features

  • Re-order items in a list, grid or board by dragging and dropping with nice animations.
  • Add custom animations when the drag is starting and ending.
  • Get a callback when a drag is started and ended with the position.
  • Disable and enable drag and drop
  • Swipe list items

Download lib with gradle

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.github.woxthebox:draglistview:1.7.2'
}

Add this to proguard rules, otherwise animations won't work correctly

-keep class com.woxthebox.draglistview.** { *; }

Usage

List and Grid layouts are used as example in the sample project.

For list and grid view use the DragListView.

    mDragListView = (DragListView) view.findViewById(R.id.drag_list_view);
    mDragListView.setDragListListener(new DragListView.DragListListener() {
        @Override
        public void onItemDragStarted(int position) {
            Toast.makeText(getActivity(), "Start - position: " + position, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onItemDragEnded(int fromPosition, int toPosition) {
            if (fromPosition != toPosition) {
                Toast.makeText(getActivity(), "End - position: " + toPosition, Toast.LENGTH_SHORT).show();
            }
        }
    });

    mDragListView.setLayoutManager(new LinearLayoutManager(getActivity()));
    ItemAdapter listAdapter = new ItemAdapter(mItemArray, R.layout.list_item, R.id.image, false);
    mDragListView.setAdapter(listAdapter);
    mDragListView.setCanDragHorizontally(false);

If you want to prevent to drag or drop items at certain positions the use these methods.

    // Prevents to drop an item in the top or bottom
    mDragListView.setCanNotDragAboveTopItem(true);
    mDragListView.setCanNotDragBelowBottomItem(true);

    // Set a callback so you can decide exactly which positions that is allowed to drag from and drop to
    mDragListView.setDragListCallback(new DragListView.DragListCallbackAdapter() {
        @Override
        public boolean canDragItemAtPosition(int dragPosition) {
            // Can not drag item at position 5
            return dragPosition != 5;
        }

        @Override
        public boolean canDropItemAtPosition(int dropPosition) {
            // Can not drop item at position 2
            return dropPosition != 2;
        }
    });

A custom drag item can be provided to change the visual appearance of the dragging item.

    mDragListView.setCustomDragItem(new MyDragItem(getActivity(), R.layout.list_item));

    private static class MyDragItem extends DragItem {
        public MyDragItem(Context context, int layoutId) {
            super(context, layoutId);
        }

        @Override
        public void onBindDragView(View clickedView, View dragView) {
            CharSequence text = ((TextView) clickedView.findViewById(R.id.text)).getText();
            ((TextView) dragView.findViewById(R.id.text)).setText(text);
            dragView.setBackgroundColor(dragView.getResources().getColor(R.color.list_item_background));
        }
    }

If you don't want items to automatically reorder when dragging you can disable that with the following code. This will do so you can swap two items instead of reorder one item as you are dragging. You should add a drop target drawable when using this feature to make it clear which item you will swap with when dropping. You can add either a background or foreground drop target drawable, or both.

    mDragListView.setDisableReorderWhenDragging(true);
    mDragListView.setDropTargetDrawables(myBackgroundDrawable, myForeGroundDrawable);

To enable swiping of list items then just set a swipe listener on the DragListView.

    mDragListView.setSwipeListener(new ListSwipeHelper.OnSwipeListenerAdapter() {
        @Override
        public void onItemSwipeStarted(ListSwipeItem item) {
            mRefreshLayout.setEnabled(false);
        }

        @Override
        public void onItemSwipeEnded(ListSwipeItem item, ListSwipeItem.SwipeDirection swipedDirection) {
            mRefreshLayout.setEnabled(true);

            // Swipe to delete on left
            if (swipedDirection == ListSwipeItem.SwipeDirection.LEFT) {
                Pair<Long, String> adapterItem = (Pair<Long, String>) item.getTag();
                int pos = mDragListView.getAdapter().getPositionForItem(adapterItem);
                mDragListView.getAdapter().removeItem(pos);
            }
        }
    });

It is also possible to configure how the swiping should work on individual items by changing supported SwipeDirection and the SwipeInStyle.

    public enum SwipeDirection {
        LEFT, RIGHT, LEFT_AND_RIGHT, NONE
    }

    public enum SwipeInStyle {
        APPEAR, SLIDE
    }

    swipeItem.setSwipeInStyle(SwipeInStyle.SLIDE)
    swipeItem.setSupportedSwipeDirection(SwipeDirection.LEFT)

The swipe item is setup from xml like this. Check out the sample app to see the details. The important thing here is to set the swipeViewId, leftViewId and rightViewId.

  <com.woxthebox.draglistview.swipe.ListSwipeItem
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      app:leftViewId="@+id/item_left"
      app:rightViewId="@+id/item_right"
      app:swipeViewId="@+id/item_layout">
      ...
      ...
  </com.woxthebox.draglistview.swipe.ListSwipeItem>

For a board, which is a number of horizontal columns with lists, then use BoardView. For an example with custom animations check the sample code. A custom header view can also be used when adding a column. This can be any view and will be attached to the top of the column. There are many different features that you can toggle on the BoardView as seen below. You read about them in the java doc of each method.

    mBoardView = (BoardView) view.findViewById(R.id.board_view);
    mBoardView.setSnapToColumnsWhenScrolling(true);
    mBoardView.setSnapToColumnWhenDragging(true);
    mBoardView.setSnapDragItemToTouch(true);
    mBoardView.setSnapToColumnInLandscape(false);
    mBoardView.setColumnSnapPosition(BoardView.ColumnSnapPosition.CENTER);
    mBoardView.setBoardListener(new BoardView.BoardListener() {
        @Override
        public void onItemDragStarted(int column, int row) {
            Toast.makeText(getActivity(), "Start - column: " + column + " row: " + row, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onItemDragEnded(int fromColumn, int fromRow, int toColumn, int toRow) {
            if (fromColumn != toColumn || fromRow != toRow) {
                Toast.makeText(getActivity(), "End - column: " + toColumn + " row: " + toRow, Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onItemChangedPosition(int oldColumn, int oldRow, int newColumn, int newRow) {
            Toast.makeText(mBoardView.getContext(), "Position changed - column: " + newColumn + " row: " + newRow, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onItemChangedColumn(int oldColumn, int newColumn) {
            TextView itemCount1 = (TextView) mBoardView.getHeaderView(oldColumn).findViewById(R.id.item_count);
            itemCount1.setText("" + mBoardView.getAdapter(oldColumn).getItemCount());
            TextView itemCount2 = (TextView) mBoardView.getHeaderView(newColumn).findViewById(R.id.item_count);
            itemCount2.setText("" + mBoardView.getAdapter(newColumn).getItemCount());
        }

        @Override
        public void onFocusedColumnChanged(int oldColumn, int newColumn) {
            Toast.makeText(getContext(), "Focused column changed from " + oldColumn + " to " + newColumn, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onColumnDragStarted(int position) {
            Toast.makeText(getContext(), "Column drag started from " + position, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onColumnDragChangedPosition(int oldPosition, int newPosition) {
            Toast.makeText(getContext(), "Column changed from " + oldPosition + " to " + newPosition, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onColumnDragEnded(int position) {
            Toast.makeText(getContext(), "Column drag ended at " + position, Toast.LENGTH_SHORT).show();
        }
    });
    mBoardView.setBoardCallback(new BoardView.BoardCallback() {
        @Override
        public boolean canDragItemAtPosition(int column, int dragPosition) {
            // Add logic here to prevent an item to be dragged
            return true;
        }

        @Override
        public boolean canDropItemAtPosition(int oldColumn, int oldRow, int newColumn, int newRow) {
            // Add logic here to prevent an item to be dropped
            return true;
        }
    });
    ...
    mBoardView.addColumn(columnProperties);

To set custom column width you can use the method below. /** * @param width the width of columns in both portrait and landscape. This must be called before {@link #addColumn} is * called for the width to take effect. */ public void setColumnWidth(int width)

Methods addColumn and insert column which returns the column view are indicated as deprecated and will be removed in future versions. Instead of them, to add or insert a column you should use ColumnProperties instance, where you can set all necessary parameters to this column.

    LinearLayoutManager layoutManager = mGridLayout ? new GridLayoutManager(getContext(), 4) : new LinearLayoutManager(getContext());
    int backgroundColor = ContextCompat.getColor(getContext(), R.color.column_background);

    ColumnProperties columnProperties = ColumnProperties.Builder.newBuilder(listAdapter)
                                  .setLayoutManager(layoutManager)
                                  .setHasFixedItemSize(false)
                                  .setColumnBackgroundColor(Color.TRANSPARENT)
                                  .setItemsSectionBackgroundColor(backgroundColor)
                                  .setHeader(header)
                                  .setColumnDrugView(header)
                                  .build();

    mBoardView.addColumn(columnProperties);

To add spacing between columns you can use BoardView parameter "columnSpacing" or indicate it programmatically via method "setColumnSpacing(int columnSpacing)" where the space should be indicated in pixels. The space before the first column and after the last one can be added by parameter "boardEdges" or programmatically via method "setBoardEdge(int boardEdge)" where space should be indicated in pixels as well.

To enable dragging and reordering of columns you need to provide a column drag view when adding the column. It is the view that will start the column drag process when long pressed on. You can also implement a custom column drag item to control the visuals and animations. Check out the sample app to see how it is done. If no custom drag item is used a screenshot of the column will be used instead.

mBoardView.setCustomColumnDragItem(new MyColumnDragItem(getActivity(), R.layout.column_drag_layout));
mBoardView.addColumn(listAdapter, header, columnDragView, false);

For your adapter, extend DragItemAdapter and call setItemList() with a List type. setItemList() can be called anytime later to change the list.

public class ItemAdapter extends DragItemAdapter<Pair<Long, String>, ItemAdapter.ViewHolder>
...
public ItemAdapter(ArrayList<Pair<Long, String>> list, int layoutId, int grabHandleId, boolean dragOnLongPress) {
    mLayoutId = layoutId;
    mGrabHandleId = grabHandleId;
    mDragOnLongPress = dragOnLongPress;
    setItemList(list);
}

The adapter must provide unique ids for each item with the implementation of the abstract method below.

/**
 * @return a unique id for an item at the specific position.
 */
 public abstract long getUniqueItemId(int position);

Your ViewHolder should extend DragItemAdapter.ViewHolder and you must supply an id of the view that should respond to a drag. You also need to provide a boolean to the super constructor to decide if you want the drag to happen on long press or directly when touching the item. If you want to respond to clicks, long clicks or touch events on the itemView root layout you should not set your own click listeners. You should instead override onItemClick, onItemLongClicked and onItemTouch as these needs to be handled in the super class when disabling and enabling drag.

public class ViewHolder extends DragItemAdapter.ViewHolder {
    public TextView mText;

    public ViewHolder(final View itemView) {
        super(itemView, mGrabHandleId, mDragOnLongPress);
        mText = (TextView) itemView.findViewById(R.id.text);
    }

    @Override
    public void onItemClicked(View view) {
        Toast.makeText(view.getContext(), "Item clicked", Toast.LENGTH_SHORT).show();
    }

    @Override
    public boolean onItemLongClicked(View view) {
        Toast.makeText(view.getContext(), "Item long clicked", Toast.LENGTH_SHORT).show();
        return true;
    }
}

License

If you feel like it then drop me a mail at [email protected] and tell me what app you have included this lib in. It is always fun to hear!

Copyright 2014 Magnus Woxblom

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • how BoardView customer column and rows like launcher?

    how BoardView customer column and rows like launcher?

    first of all,thank you very much:) thank you for your work.

    i want to how BoardView or DragListView customer column and rows like launcher? i want to user it to develop a view like launcher,andr sort icons like ios desk,at the same time could drag between pages.

    thanks a lot:)

    could this can help me? thanks you very much :)

    opened by yuxingfafu 30
  • Member visibility issues with DragItemAdapter, and other issues

    Member visibility issues with DragItemAdapter, and other issues

    1. mDragItemId is private, i had to use reflection to get its value
    2. setDragStartCallback in ViewHolder is public, but its argument is package private, so i can not override that method anyway

    I bumped in this issue because i needed to implement a custom drawing for an empty space, it was achieved by alternating item appearance during binding of view holder and it was troublesome. Also I had to directly manipulate a view tree to achieve the same behavior for columns.

    Also i had to use the trick below to achieve visually appealing jump for column when it's ready to be dragged

    override fun onStartDragAnimation(dragView: View) {
    
            // ATTENTION: dirty hacky games with reflection
            try {
                val method = this.javaClass.superclass.getDeclaredMethod(
                    "setAnimationDY",
                    Float::class.java
                )
                method.isAccessible = true
                method.invoke(this, targetElevation)
            } catch (ex: Throwable) {
                // Just ignore if no success
                Timber.e(ex)
            }
    
            val container = dragView as ConstraintLayout
            ObjectAnimator.ofFloat(container, ELEVATION, targetElevation).apply {
                interpolator = DecelerateInterpolator()
                duration = ANIMATION_DURATION
                start()
            }
        }
    

    In conclusion, the library is great, but lacks flexibility

    opened by dron247 20
  • Change the color of the dragView at item drop

    Change the color of the dragView at item drop

    @Override public void onItemDragEnded(int fromPosition, int toPosition) { if (Long.valueOf(toPosition).equals((Long)(mItemArray.get(toPosition).first))) { Toast.makeText(mDragListView.getContext(), "Correct position", Toast.LENGTH_SHORT).show(); //change the color of item } else { Toast.makeText(mDragListView.getContext(), "Incorrect position", Toast.LENGTH_SHORT).show(); //change the color of the item } }

    If the row is in its correct position, the row should change its color. Also, this row should not be draggable anymore. How can I acheive this?

    opened by acmontoya 17
  • Poc

    Poc

    We needed to some drag and drop feature row wise and also needed to have it as expandable list, for that, we required to make tiny modification in existing code to adapt it to work with y axis. Added new class "BoardViewWithExpandableList" for row wise view, we tried to make it such way so that existing features doesn't break.

    opened by arafath 17
  • java.lang.IllegalAccessException RenderingProblems

    java.lang.IllegalAccessException RenderingProblems

    Xml File Set Inner <com.woxthebox.draglistview.DragListView android:id="@+id/lv_academy" android:layout_width="match_parent" android:layout_height="match_parent" />

    Error Content

    Rendering Problems java.lang.IllegalAccessException: Class com.android.layoutlib.bridge.util.ReflectionUtils can not access a member of class com.woxthebox.draglistview.DragItemRecyclerView with modifiers "public"   at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)   at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)   at java.lang.reflect.Method.invoke(Method.java:490)   at com.android.layoutlib.bridge.util.ReflectionUtils.invoke(ReflectionUtils.java:45)   at com.android.layoutlib.bridge.android.support.RecyclerViewUtil.setProperty(RecyclerViewUtil.java:126)   at com.android.layoutlib.bridge.android.support.RecyclerViewUtil.setProperty(RecyclerViewUtil.java:120)   at com.android.layoutlib.bridge.android.support.RecyclerViewUtil.setLayoutManager(RecyclerViewUtil.java:78)   at com.android.layoutlib.bridge.android.support.RecyclerViewUtil.setAdapter(RecyclerViewUtil.java:59)   at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)   at android.view.LayoutInflater.inflate(LayoutInflater.java:492)   at android.view.LayoutInflater.inflate(LayoutInflater.java:423)   at com.woxthebox.draglistview.DragListView.createRecyclerView   ... (DragListView.java:131)   at com.woxthebox.draglistview.DragListView.onFinishInflate(DragListView.java:94)

    Maybe private or Protectd -> public change?

    opened by nextkaki 15
  • unable to drag normally

    unable to drag normally

    I looked at the sample,but it's not the latest.I read the README.md but it does not work.Can you help me?

    public class DragListViewAdapter extends DragItemAdapter { int layoutId; int grabHandleId; boolean dragOnLongPress ; String account; public DragListViewAdapter(List tasks, int layoutId, int grabHandleId, boolean dragOnLongPress, String account) { this.layoutId = layoutId; this.grabHandleId = grabHandleId; this.dragOnLongPress = dragOnLongPress; setHasStableIds(true); setItemList(tasks); this.account = account; }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        DragItemAdapter.ViewHolder viewHolder = new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(layoutId,parent,false),
                grabHandleId,dragOnLongPress);
        return viewHolder;
    }
    
    @Override
    public void onBindViewHolder(DragItemAdapter.ViewHolder holder, int position) {
        Task task = (Task) mItemList.get(position);
      //  ((ViewHolder)holder).deviceName.setText(SQLUtils.newInstances(context).queryDeviceNameByDid(task.getDid(),account));
        ((ViewHolder)holder).deviceName.setText("hahaahha");
        ((ViewHolder)holder).task.setText(task.getTask());
    }
    
    class ViewHolder extends DragItemAdapter.ViewHolder{
    
        ImageView delete;
        TextView deviceName;
        TextView task;
    
        public ViewHolder(View itemView, int handleResId, boolean dragOnLongPress) {
            super(itemView, handleResId, dragOnLongPress);
            delete = (ImageView) itemView.findViewById(R.id.iv_delete);
            deviceName = (TextView) itemView.findViewById(R.id.tv_deviceName);
            task = (TextView) itemView.findViewById(R.id.tv_task);
        }
    }
    

    }

    opened by Bombast1c 14
  • onItemClicked not getting detected

    onItemClicked not getting detected

    I am using <com.woxthebox.draglistview.swipe.ListSwipeItem> and <com.woxthebox.draglistview.DragListView> for my custom listview. I followed the sample example to write the code. My swipe and drag working perfectly fine. But onItemClick event is not getting called from the ViewHolder of the adapter. I tried adding android:clickable="false" for itemLayout child controls and android:clickable="true" in <com.woxthebox.draglistview.DragListView>, but itemClick still not working.

    Please let me know if I have to add or remove something to make it work.

    Thanks.

    opened by Sonalboraste 11
  • layout params not working properly

    layout params not working properly

    hey u did a great work looking for this implementation from many many days

    I just integrated your library with source code. because i need some customization.

    so my requirement is to wrap the height of the container containing boards

    i just change layout params

    from LayoutParams params = new LayoutParams(mColumnWidth, LayoutParams.MATCH_PARENT);

    to LayoutParams params = new LayoutParams(mColumnWidth, LayoutParams.WRAP_CONTENT);

    height is working good when i arrive to page first time. but the problem occur when i drag and drop items from one boards to another board.

    please take a look i have added a screenshot

    issue i am facing

    screenshot_4

    screenshot_3

    view without drag drop is fine

    please let me know what is wrong there.

    opened by rizwan321 10
  • Drag on whole item but still listen to click

    Drag on whole item but still listen to click

    I set the grabHandleId to the whole item layout (not just an image) like suggested in #63 but now the onItemClicked method of the viewHolder is no longer executed.

    Is there something I'm missing or is that just not possible?

    opened by morhenny 9
  • drag behaves weird after adding padding

    drag behaves weird after adding padding

    I try several ways to add padding

    1. Directly add android:padding to dragview in xml https://youtu.be/v-Y7RQtceeA

    2. Add padding to recycleview programatically https://youtu.be/xVNGIXSUJxI

    Both behave weird but differently. Any clue?

    opened by kuoliangkwong 9
  • Snapping to the left instead of center (when columns are narrower than the screen width)

    Snapping to the left instead of center (when columns are narrower than the screen width)

    Hi,

    Thanks again for your help with the past issues you have addressed (with Pivotal Tracker).

    We'd like to propose a change to the snapping behavior:

    When snapping, columns align to the left of the screen instead of center (i.e. the column whose left edge is the closest to the left edge of the screen will scroll to be left-aligned with the screen) This is the behavior of a ViewPager whose pages take up less than 100% of parent's width.

    Additionally, we would like the option of changing the behavior for the right-most column, which currently snaps to the right of the screen. We would want it to also be left aligned, leaving some empty space to its right.

    Let us know what you think, or if a video would help demonstrate the behavior. Thanks, Vera & Tracker friends

    opened by vreynolds 9
Releases(v1.7.1)
Owner
Magnus Woxblom
Magnus Woxblom
Provides 9-patch based drop shadow for view elements. Works on API level 9 or later.

Material Shadow 9-Patch This library provides 9-patch based drop shadow for view elements. Works on API level 14 or later. Target platforms API level

Haruki Hasegawa 481 Dec 19, 2022
A TagView library for Android. Customize your own & Drag effect.

AndroidTagView An Android TagView library. You can customize awesome TagView by using this library. Screenshots Usage Step 1 Add below dependency in y

lujun 1.7k Dec 29, 2022
The CustomCalendarView provides an easy and customizable calendar to create a Calendar. It dispaly the days of a month in a grid layout and allows to navigate between months

Custom-Calendar-View To use the CustomCalendarView in your application, you first need to add the library to your application. You can do this by eith

Nilanchala Panigrahy 113 Nov 29, 2022
Cube grid animation about the android.

CubeGrid Cube grid animation about the android. The android implementation about the 9-cube-grid Demo Usage Add dependency allprojects { repositories

alighters 218 Nov 23, 2022
An Android custom view to display digits rendered as dots in a grid, with a style like a 1970s LED clock.

#DotMatrixView This is an Android library project providing a custom view that can display things on a grid of dots. When the displayed value changes,

Mark Roberts 48 Apr 21, 2022
An Android application which visualizes some of the famous Algorithms for finding path from Source to Destination in a 2D grid.

Pathfinding-Visualizer An Android application which visualizes some of the famous Algorithms for finding path from Source to destination in a 2D grid.

Pranjal Mishra 37 Aug 8, 2022
Android library to display a list of items for pick one

PickerUI Android library to display a list of items for pick one with blur effect (if you wish). Support for Android 3.0 and up. It supports portrait

David Pizarro 630 Nov 19, 2022
A new canvas drawing library for Android. Aims to be the Fabric.js for Android. Supports text, images, and hand/stylus drawing input. The library has a website and API docs, check it out

FabricView - A new canvas drawing library for Android. The library was born as part of a project in SD Hacks (www.sdhacks.io) on October 3rd. It is cu

Antwan Gaggi 1k Dec 13, 2022
An Android library supports badge notification like iOS in Samsung, LG, Sony and HTC launchers.

ShortcutBadger: The ShortcutBadger makes your Android App show the count of unread messages as a badge on your App shortcut! Supported launchers: Sony

Leo Lin 7.2k Dec 30, 2022
DailyTags - a flexible markdown library that supports custom tags and markups

The library parses a given markup into rich text for Jetpack Compose. DailyTags comes with Markdown and HTML support by default (please, see the supported features) and is very easy to extend to support custom markups.

Dmytro 134 Dec 25, 2022
A Material design Android pincode library. Supports Fingerprint.

LolliPin A Lollipop material design styled android pincode library (API 14+) To include in your project, add this to your build.gradle file: //Loll

Omada Health 1.6k Nov 25, 2022
An Android Widget for selecting items that rotate on a wheel.

Looking for maintainers I'm no longer active on this project but I'll still focus on fixing crashing issues and review any code changes etc. WheelView

Luke Deighton 888 Jan 3, 2023
Android Library that lights items for tutorials or walk-throughs etc...

Spotlight Gradle dependencies { implementation 'com.github.takusemba:spotlight:x.x.x' } Usage val spotlight = Spotlight.Builder(this) .setTarg

TakuSemba 3.4k Dec 31, 2022
Spinner with searchable items.

SearchableSpinner Spinner with searchable items. Searchable Spinner is a dialog spinner with the search feature which allows to search the items loade

Mitesh Pithadiya 649 Dec 21, 2022
Overscroll any scrollable items!

ComposeOverscroll Overscroll any scrollable items! Preview compare with iOS demo Preview.for.overscroll.and.nested.invoke.mp4 How to use for column :

null 7 Dec 15, 2022
Android StackBlur is a library that can perform a blurry effect on a Bitmap based on a gradient or radius, and return the result. The library is based on the code of Mario Klingemann.

Android StackBlur Android StackBlur is a library that can perform a blurry effect on a Bitmap based on a gradient or radius, and return the result. Th

Enrique López Mañas 3.6k Dec 29, 2022
Janishar Ali 2.1k Jan 1, 2023
This project has been superseded by SuperSLiM, a layout manager for RecyclerView. I strongly recommend using SuperSLiM and not StickyGridHeaders.

StickyGridHeaders Replacement project at SuperSLiM This repository is abandoned and will no longer see any development or support. The replacement Sup

Tonic Artos 1.5k Nov 15, 2022
Android library for multiple snapping of RecyclerView

MultiSnapRecyclerView Gradle dependencies { implementation 'com.github.takusemba:multisnaprecyclerview:x.x.x' } Features This is an Android Libra

TakuSemba 2.5k Jan 4, 2023