Android列表视图拖放sorting

我有一个listview中的logging列表,我希望用户能够使用拖放方法重新sorting。 我已经看到这在其他应用程序中实现,但我还没有find一个教程。 这一定是别人需要的东西。 任何人都可以指向我一些代码做这个?

我一直在这个工作了一段时间了。 很难得到正确的,我不要求我做,但我很高兴。 我的代码和几个演示可以在find

它的使用与TouchInterceptor(代码所基于的)非常相似,尽pipe已经做了重大的实现改变。

DragSortListView在拖动和洗牌项目时具有平滑和可预测的滚动。 物品洗牌与拖动/浮动物品的位置更加一致。 支持异构高度列表项目。 拖动滚动是可定制的(我展示了通过长列表快速拖动滚动—不是一个应用程序想到)。 页眉/页脚是尊重。 等等。?? 看一看。

我join这个答案是为了那些谁的谷歌这个..

最近有一段DevBytes( ListView Cell拖拽和重排 ),解释了如何做到这一点

你可以在这里find它的示例代码在这里 。

这个代码基本上做的是它通过支持单元格拖放和交换的listview的扩展创build一个dynamic listview listview 。 所以你可以使用DynamicListView而不是基本的ListView ,这就是你已经实现了一个带有拖放的ListView。

现在使用ItemTouchHelper实现RecyclerView非常简单。 只需重写onMove方法:

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

关于此的相当不错的教程可以在medium.com上find: 拖动和用RecyclerView刷卡

DragListView lib这样做非常好,非常好的支持自定义animation,如高程animation。 它也是定期维护和更新的。

这里是你如何使用它:

1:先将lib添加到gradle

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

2:从XML中添加列表

 <com.woxthebox.draglistview.DragListView android:id="@+id/draglistview" android:layout_width="match_parent" android:layout_height="match_parent"/> 

3:设置拖动监听器

 mDragListView.setDragListListener(new DragListView.DragListListener() { @Override public void onItemDragStarted(int position) { } @Override public void onItemDragEnded(int fromPosition, int toPosition) { } }); 

4:创build一个从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); } 

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; } } 

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

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

  1. 将此添加到您的应用程序的build.gradle相关性中:

     compile 'asia.ivity.android:drag-sort-listview:1.0' // Corresponds to release 0.6.1 
  2. 通过创build或添加到values/ids.xml来为拖动values/ids.xml ID创build资源:

     <resources> ... possibly other resources ... <item type="id" name="drag_handle" /> </resources> 
  3. 创build包含您最喜爱的拖动手柄图像的列表项目的布局,并将其ID分配给您在步骤2中创build的ID(例如drag_handle )。

  4. 创build一个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"/> 
  5. 用一个getView覆盖来设置一个ArrayAdapter衍生物,它呈现你的列表项视图。

      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); 
  6. 设置一个放置监听器,在丢弃项目时重新排列这些项目。

      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(); } });