Android列表视图拖放排序

mia*_*lle 132 android listview

我在列表视图中有一个记录列表,我希望用户能够使用拖放方法重新排序.我已经看到这在其他应用程序中实现,但我还没有找到它的教程.它必须是其他人需要的东西.有人能指点我做一些代码吗?

hey*_*smo 85

我已经有一段时间了.很难做到正确,而且我没有声称我这样做,但到目前为止我对它很满意.我的代码和几个演示可以在

尽管已经进行了重大的实现更改,但它的使用与TouchInterceptor(代码所基于的)非常相似.

DragSortListView在拖动和随机播放项目时具有平滑且可预测的滚动.项目随机播放与拖动/浮动项目的位置更加一致.支持异构高度列表项.拖动是可自定义的(我演示了快速拖动滚动浏览长列表 - 而不是想到应用程序).页眉/页脚受到尊重.等等.??看一看.

  • 不再保留bauerca回购.这个分支更活跃:https://github.com/JayH5/drag-sort-listview (7认同)
  • 您的解决方案就像一个魅力.比其他人好多了.什么是源代码的许可证?Apache 2.0? (3认同)

bir*_*rdy 20

现在RecyclerView使用ItemTouchHelper很容易实现.只需覆盖以下onMove方法ItemTouchHelper.Callback:

 @Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
    mMovieAdapter.swap(viewHolder.getAdapterPosition(), target.getAdapterPosition());
    return true;
}
Run Code Online (Sandbox Code Playgroud)

可以在medium.com上找到相当不错的教程:使用RecyclerView拖动和滑动


Aru*_*n C 18

我是为了谷歌这个人的目的添加这个答案..

最近有一集DevBytes(ListView Cell Dragging 和Rearranging)解释了如何做到这一点

你可以找到它在这里也示例代码,请点击这里.

这段代码基本上做的是它dynamic listview通过扩展创建一个listview支持单元格拖动和交换.这样你就可以使用 DynamicListView而不是你的基础了ListView ,就是你用Drag and Drop实现了ListView.


Wox*_*Wox 6

DragListView lib非常好用,可以很好地支持自定义动画,例如高程动画.它仍然定期维护和更新.

以下是您使用它的方式:

1:首先将lib添加到gradle

dependencies {
    compile 'com.github.woxthebox:draglistview:1.2.1'
}
Run Code Online (Sandbox Code Playgroud)

2:从xml添加列表

<com.woxthebox.draglistview.DragListView
    android:id="@+id/draglistview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
Run Code Online (Sandbox Code Playgroud)

3:设置拖动侦听器

mDragListView.setDragListListener(new DragListView.DragListListener() {
    @Override
    public void onItemDragStarted(int position) {
    }

    @Override
    public void onItemDragEnded(int fromPosition, int toPosition) {
    }
});
Run Code Online (Sandbox Code Playgroud)

4:创建从DragItemAdapter覆盖的适配器

public class ItemAdapter extends DragItemAdapter<Pair<Long, String>, ItemAdapter.ViewHolder>
    public ItemAdapter(ArrayList<Pair<Long, String>> list, int layoutId, int grabHandleId, boolean dragOnLongPress) {
        super(dragOnLongPress);
        mLayoutId = layoutId;
        mGrabHandleId = grabHandleId;
        setHasStableIds(true);
        setItemList(list);
}
Run Code Online (Sandbox Code Playgroud)

5:实现从DragItemAdapter.ViewHolder扩展的视图

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

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

    @Override
    public void onItemClicked(View view) {
    }

    @Override
    public boolean onItemLongClicked(View view) {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请访问https://github.com/woxblom/DragListView


Edw*_*rey 5

我发现DragSortListView运行良好,虽然开始使用它可能会更容易.以下是在Android Studio中使用内存列表的简要教程:

  1. 将其添加到build.gradle您的应用的依赖项:

    compile 'asia.ivity.android:drag-sort-listview:1.0' // Corresponds to release 0.6.1
    
    Run Code Online (Sandbox Code Playgroud)
  2. 通过创建或添加到values/ids.xml以下内容为拖动句柄ID创建资源:

    <resources>
        ... possibly other resources ...
        <item type="id" name="drag_handle" />
    </resources>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 为包含您最喜欢的拖动控制柄图像的列表项创建布局,并将其ID分配给您在步骤2中创建的ID(例如drag_handle).

  4. 创建一个DragSortListView布局,如下所示:

    <com.mobeta.android.dslv.DragSortListView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:dslv="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        dslv:drag_handle_id="@id/drag_handle"
        dslv:float_background_color="@android:color/background_light"/>
    
    Run Code Online (Sandbox Code Playgroud)
  5. ArrayAdapter使用getView覆盖设置衍生,以呈现列表项视图.

        final ArrayAdapter<MyItem> itemAdapter = new ArrayAdapter<MyItem>(this, R.layout.my_item, R.id.my_item_name, items) { // The third parameter works around ugly Android legacy. http://stackoverflow.com/a/18529511/145173
            @Override public View getView(int position, View convertView, ViewGroup parent) {
                View view = super.getView(position, convertView, parent);
                MyItem item = getItem(position);
                ((TextView) view.findViewById(R.id.my_item_name)).setText(item.getName());
                // ... Fill in other views ...
                return view;
            }
        };
    
        dragSortListView.setAdapter(itemAdapter);
    
    Run Code Online (Sandbox Code Playgroud)
  6. 设置一个drop listener,在删除项目时重新排列项目.

        dragSortListView.setDropListener(new DragSortListView.DropListener() {
            @Override public void drop(int from, int to) {
                MyItem movedItem = items.get(from);
                items.remove(from);
                if (from > to) --from;
                items.add(to, movedItem);
                itemAdapter.notifyDataSetChanged();
            }
        });
    
    Run Code Online (Sandbox Code Playgroud)