Coder Social home page Coder Social logo

yydcdut / slideanddraglistview Goto Github PK

View Code? Open in Web Editor NEW
515.0 40.0 190.0 37.5 MB

:curly_loop:SlideAndDragListView (SDLV) is an extension of the Android ListView that enables slide and drag-and-drop reordering of list items.

License: Apache License 2.0

Java 100.00%
listview animation android-listview slide-directions android android-library drag-and-drop

slideanddraglistview's Introduction

SlideAndDragListView

Download License Build Status API

A ListView that you can slide ( or swipe ) the items, drag and drop the items to other places.

sdlv

中文:CHINESE.md

Demo: DOWNLOAD

ChangeLog: CHANGELOG.md

Overview

SlideAndDragListView (SDLV) is an extension of the Android ListView that enables slide and drag-and-drop reordering of list items.

 Some key features are:

  1. Clean drag and drop.
  2. Intuitive and smooth scrolling while dragging or sliding.
  3. Support onItemClick and onItemLongClick listener.
  4. Public callback methods.
  5. Two side of item can slide.
  6. so on...

SlideAndDragListView is useful for all kinds of prioritized lists: favorites, playlists, checklists, etc. Would love to hear about your use case or app by email. I hope you find it useful; and please, help me improve the thing!

Binaries

Gradle

compile 'com.yydcdut:sdlv:0.7.6'

Jar

DOWNLOAD

Widget Usage

Menu Item Click & Slide Directions

Step 1

  • Add SlideAndDragListView in layout xml
<com.yydcdut.sdlv.SlideAndDragListView
        android:layout_width="match_parent"
        android:layout_height="match_parent">
</com.yydcdut.sdlv.SlideAndDragListView>

Step 2

  • Create a Menu and add MenuItem
Menu menu = new Menu(true, 0);//the first parameter is whether can slide over
menu.addItem(new MenuItem.Builder().setWidth(90)//set Width
                .setBackground(new ColorDrawable(Color.RED))// set background
                .setText("One")//set text string
                .setTextColor(Color.GRAY)//set text color
                .setTextSize(20)//set text size
                .setIcon(getResources().getDrawable(R.drawable.ic_launcher))// set icon
                .build());
menu.addItem(new MenuItem.Builder().setWidth(120)
                .setBackground(new ColorDrawable(Color.BLACK))
                .setDirection(MenuItem.DIRECTION_RIGHT)//set direction (default DIRECTION_LEFT)
                .setIcon(getResources().getDrawable(R.drawable.ic_launcher))// set icon
                .build());
//set in sdlv
slideAndDragListView.setMenu(menu);

The class Menu, the construct function Menu(boolean slideOver, int menuViewType), the first parameter means whether can slide over.

If it’s true:

If it’s false:

The second parameter stands for view type, the value of int getItemViewType(int) in BaseAdapter.

Step 3

  • Implement menu item click listener
slideAndDragListView.setOnMenuItemClickListener(new OnMenuItemClickListener() {
    @Override
    public int onMenuItemClick(View v, int itemPosition, int buttonPosition, int direction) {
        switch (direction) {
            case MenuItem.DIRECTION_LEFT:
                switch (buttonPosition) {
                    case 0://One
                        return Menu.ITEM_SCROLL_BACK;
                }
                break;
            case MenuItem.DIRECTION_RIGHT:
                switch (buttonPosition) {
                    case 0://icon
                        return Menu.ITEM_DELETE_FROM_BOTTOM_TO_TOP;
                }
                break;
            default :
                return Menu.ITEM_NOTHING;
        }
        return Menu.ITEM_NOTHING;
    }
});

Menu.ITEM_NOTHING:

Menu.ITEM_SCROLL_BACK:

Menu.ITEM_DELETE_FROM_BOTTOM_TO_TOP:

Create Different Menu

  • Use the ViewType of adapter
private BaseAdapter mAdapter = new BaseAdapter() {
        // .......
        @Override
        public int getItemViewType(int position) {
            return position % 2;//current menu type
        }

        @Override
        public int getViewTypeCount() {
            return 2;//menu type count
        }
  		// ......
}
  • Create different menus depending on the view type
List<Menu> menuList = new ArrayList<>(2);
Menu menu0 = new Menu(new ColorDrawable(Color.WHITE), true, 0);
menu0.addItem(new MenuItem.Builder().setWidth(90)//set Width
                .setBackground(new ColorDrawable(Color.RED))// set background
                .setText("One")//set text string
                .setTextColor(Color.GRAY)//set text color
                .setTextSize(20)//set text color
                .build());
menu0.addItem(new MenuItem.Builder().setWidth(120)
                .setBackground(new ColorDrawable(Color.BLACK))
                .setDirection(MenuItem.DIRECTION_RIGHT)//set direction (default DIRECTION_LEFT)
                .setIcon(getResources().getDrawable(R.drawable.ic_launcher))// set icon
                .build());
Menu menu1 = new Menu(new ColorDrawable(Color.YELLOW), false, 1);
menu1.addItem(new MenuItem.Builder().setWidth(60)
                .setBackground(new ColorDrawable(Color.RED))
                .setText("Two")
                .setTextColor(Color.GRAY)
                .setTextSize(25)
                .build());
menu1.addItem(new MenuItem.Builder().setWidth(70)
                .setBackground(new ColorDrawable(Color.BLUE))
                .setText("Three")
                .setDirection(MenuItem.DIRECTION_RIGHT)
                .setTextColor(Color.BLACK)
                .setTextSize(20)
                .build());
menuList.add(menu0);
menuList.add(menu1);
listView.setMenu(menuList)
  • See the demo

Drag

ApplicationInfo mDraggedEntity;
List<ApplicationInfo> mDataList;

// ...init...

slideAndDragListView.setOnDragDropListener(new OnDragDropListener() {
    @Override
    public void onDragViewStart(int beginPosition) {
        mDraggedEntity = mDataList.get(beginPosition);
    }

    @Override
    public void onDragDropViewMoved(int fromPosition, int toPosition) {
		ApplicationInfo applicationInfo = mDataList.remove(fromPosition);
      	mDataList.add(toPosition, applicationInfo);
    }

    @Override
    public void onDragViewDown(int finalPosition) {
		mDataList.set(finalPosition, mDraggedEntity);
    }
});

public void onDragViewStart(int position).The parameter position is the position in ListView where dragged from.

public void onDragDropViewMoved(int fromPosition, int toPosition) .The parameters fromPosition and toPosition are the positions in ListView where dragged from and dragged to.

public void onDragViewDown(int position) . The parameter position is the position in ListView where dropped down.

Other Listeners

Item Slide Listener

slideAndDragListView.setOnSlideListener(new OnSlideListener() {
    @Override
    public void onSlideOpen(View view, View parentView, int position, int direction) {
        
    }

    @Override
    public void onSlideClose(View view, View parentView, int position, int direction) {

    }
});

public void onSlideOpen(View view, View parentView, int position, int direction). The parameter view is the ListView item that is slide open, parentView here is SDLV, position is the position of the view in the list, and the parameter direction is the item slided direction.

public void onSlideClose(View view, View parentView, int position, int direction). The parameter view is the ListView item that is slide close,parentView here is SDLV, position is the position of the view in the list, and the parameter direction is the item slided direction.

Item Delete Listener

slideAndDragListView.setOnItemDeleteListener(new OnItemDeleteListener() {
    @Override
    public void onItemDeleteAnimationFinished(View view, int position) {
        
    }
});

public void onItemDeleteAnimationFinished(View view, int position) will invoked after int onMenuItemClick(View v, int itemPosition, int buttonPosition, int direction) return Menu.ITEM_DELETE_FROM_BOTTOM_TO_TOP.

Item Menu Scroll Back Listener

slideAndDragListView.setOnItemScrollBackListener(new OnItemScrollBackListener() {
    @Override
    public void onScrollBackAnimationFinished(View view, int position) {

    }
});

public void onScrollBackAnimationFinished(View view, int position) will invoked after int onMenuItemClick(View v, int itemPosition, int buttonPosition, int direction) return Menu.ITEM_SCROLL_BACK.

API

Slide(Open) Menu

slideAndDragListView.slideItem(position, direction)

slide(open) menu by API.

Close Menu

slideAndDragListView.closeSlidedItem();

Close menu by API.

Delete Menu

slideAndDragListView.deleteSlideItem();

Delete menu by API.

Drag

slideAndDragListView.startDrag(position);

Drag list item.

Not Drag headers or footers view types

slideAndDragListView.setNotDragHeaderCount(1);
slideAndDragListView.setNotDragFooterCount(1);

See more: HeaderFooterViewTypeActivity.java

License

Copyright 2015 yydcdut

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.

slideanddraglistview's People

Contributors

dubiao avatar thinkingpig avatar yydcdut avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

slideanddraglistview's Issues

向下拖拽列表不滚动

在SDLV下面添加一个View后(比如Button),向下拖拽列表就滚动不了了,向上是可以正常拖拽的

左滑删除后的bug

左滑删除item以后,会出现其他item再次左滑出现UI界面问题,多试几次就会出现

问题反馈

0.7版,假设listView一共有10项,最下面无法直接在屏幕上显示出来的那几个item显示的内容和第一条一样(也有可能是最新添加进来的一样,因为我的最新添加的默认在第一个),严重影响使用

新的issues:升级sdk 到27 ,gradle 4.1 列表上下不能滑动,希望可以解决一下。

还有一个问题是我升级了sdk 跟gradle整体列表不能上下滑动了。我现升级的用的sdk版本如下:
compileSdkVersion 27
buildToolsVersion '27.0.3'
gradle-4.1
一样的代码,我没有改动,原来老的sdk:
targetSdkVersion : 23,
gradle-2.2
都是可以上下滑动的,也没报那个错。只是升级了sdk,更新了gradle ,现在集成到了项目,希望楼主可以早点fix 掉,十分感谢!

onItemDelete

onItemDelete 方法中remove相应position数据且notifyDataSetChanged后,界面始终删除最后一个item,而不是相应的position位置的item

在使用了sdlv以后,通过后台统计出现这个崩溃

我的Activity里面的XML将SlideAndDragListView的id设置为了android:id="@+id/step_list"。XML中没有其他重复id。
在开发时没有遇到问题,发布后通过统计发现了如下崩溃信息。崩溃率大概0.05%。
能否帮忙分析一下原因?自己分析不出来了。
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp/com.myapp.myactivity}:
java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class android.widget.AbsListView$SavedState instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/step_list. Make sure other views do not use the same id.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2404)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2466)
at android.app.ActivityThread.access$900(ActivityThread.java:175)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1369)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5418)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1037)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
Caused by: java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class android.widget.AbsListView$SavedState instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/step_list. Make sure other views do not use the same id.
at android.view.View.onRestoreInstanceState(View.java:13827)
at android.view.View.dispatchRestoreInstanceState(View.java:13803)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2917)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2923)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2923)
at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:2923)
at android.view.View.restoreHierarchyState(View.java:13781)
at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:2099)
at android.app.Activity.onRestoreInstanceState(Activity.java:1046)
at android.app.Activity.performRestoreInstanceState(Activity.java:1001)
at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1171)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2377)
... 10 more

问题反馈

我刚使用了下最新的版本0.7.0,但是它会跟我的下拉刷新控件(XRefreshView)冲突,导致我的列表显示不全,只能显示屏幕能显示的最大条数,同样的0.5.4是可以的。

Observer com.yydcdut.sdlv.WrapperAdapter$1@2a68a57 was not registered.

嵌在ViewPager中,当滑动时可能造成如题错误,如果不用该控件现有BaseAdapter是没有问题的。具体如下:
java.lang.IllegalStateException: Observer com.yydcdut.sdlv.WrapperAdapter$1@2a68a57 was not registered.
at android.database.Observable.unregisterObserver(Observable.java:69)
at android.widget.BaseAdapter.unregisterDataSetObserver(BaseAdapter.java:42)
at com.yydcdut.sdlv.WrapperAdapter.removeDataSetObserver(WrapperAdapter.java:308)
at com.yydcdut.sdlv.SlideListView.onDetachedFromWindow(SlideListView.java:481)
at android.view.View.dispatchDetachedFromWindow(View.java:15471)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:3226)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:3218)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:3218)
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:4754)
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:4728)
at android.view.ViewGroup.removeView(ViewGroup.java:4659)
at android.support.v4.view.ViewPager.removeView(ViewPager.java:1527)

请问这个问题是不兼容的API版本造成的,还是Adapter写的有问题?有什么办法可以避免观察者导致的问题?目前给ViewPager设置缓存数量确保不刷新时才不会出问题

Drag n Drop not working in Motorola devices

I have used com.yydcdut.sdlv.SlideAndDragListView library in listView for implementing swipe(to delete) and drag drop functionality(for re-ordering items).
Dragging will be activated on the onListItemLongClick. It is working fine on all the devices.
But, in the motorola devices, onListItemLongClick() is not working or in some motorola devices it is taking so much time to respond.
Please suggest some solution.

上啦加载,下拉刷新时setOnListItemClickListener有bug

我使用com.aspsine.swipetoloadlayout.SwipeToLoadLayout在SlideAndDragListView的外层实现了上啦加载,下拉刷新功能,但发现ListView的item点击事件监听分不清是上下滑动还是点击事件!请在dispatchTouchEvent中添加上下滑动的判断

升级sdk 到27 ,gradle 4.1 列表上下不能滑动,希望可以解决一下。

还有一个问题是我升级了sdk 跟gradle整体列表不能上下滑动了。我现升级的用的sdk版本如下:
compileSdkVersion 27
buildToolsVersion '27.0.3'
gradle-4.1
一样的代码,我没有改动,原来老的sdk:
targetSdkVersion : 23,
gradle-2.2
都是可以上下滑动的,也没报那个错。只是升级了sdk,更新了gradle ,现在集成到了项目,希望楼主可以早点fix 掉,十分感谢!

删除item的时候出现bug

在删除item的时候,集合中的数据显示remove的位置是正确的,但是重新渲染后,在界面上又出现那条我想删的数据。测试了一下午,发现使用你demo中的adapter就不会出现问题,而我自己写一个几乎和你一模一样的适配器,就出现删除后重新渲染混乱的问题,我很懵逼。希望大神能给解决一下

menu的构造函数不对

并没有这个构造函数Menu menu0 = new Menu(new ColorDrawable(Color.WHITE), true, 0);
只有没带颜色参数的两个构造函数

MenuItem点击无效

向左滑动,滑出一部分之后再滑回去,OnMenuItem点击事件失效,具体滑动多少不知道

如果能根据数据动态更改menuitem的属性就更加完美了

比如,根据数据我想要一句代码更改menuitem的文字来表示不同的状态。或者menuitem的背景颜色。
我现在的做法是先removeItem原来的menuitem 再添加个新的,这样做感觉好麻烦。还是小萌新 如果大佬能让这个过程一句代码搞定就太完美了!

侧滑不会回去是怎么回事呢

我写了个 添加了一个右侧删除按钮 但是划出来不会划回去了 要一直按着划出去不离开屏幕再回来才会滑回来 我setOnSlideListener划出去和回来都会触发 请问有什么方法可以在onSlideClose里面调用嘛让我规避这个方法

侧滑删除item时,无法定位position

侧滑删除Item时加AlertDialog判断会出现先remove掉Item然后又出现Item并显示dialog,还有删除时无法定位position,只能按顺序删除,不是第一条Item时无法进行删除操作

Drag不能移动

设置了Drag监听,只有start 和 down 状态能响应,move的回调不会响应

拖拽排序问题太多

1、拖拽排序的时候 item不应该左右可以移动
2、item竟然可以移动到app外面,应该在listview范围内移动
3、item 长按之后移动的时候 一个副本跟着手势移动,Listview 里面这一条不应该去掉吗?应该显示空白区域

问题反馈:

在0.5.4版本中,这个listview的上滑和下滑和下拉刷新控件不会冲突,但是在最新的版本中,它的事件总是被下拉刷新控件抢占,根本就不响应。

How can I use the custom adapter ?

I tried to use the custom adapter class in this draglistview as followings
public class EditCardsListAdapter extends BaseAdapter {

editCardsListAdapter = new EditCardsListAdapter(this, cardList, this); cardListView.setAdapter(editCardsListAdapter);
cardListView.setOnDragDropListener(this);

Can you let me now how to use the custom adapter in your draglistview.
Thanks

如何在adapter中获取每个条目菜单的item

首先感谢博主分享,我现在有一个需求就是,右侧滑出的菜单是关注和完成两个选项,点击关注,就变成取消关注,所以我需要获取到这个菜单项,然后动态改变它的文字,请问博主,我怎么样可以获取到右侧菜单项。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.