Android 带有 BaseAdapter 拖放排序的列表视图

Android List View with BaseAdapter Drag and Drop sort

我在列表视图中有一个记录列表,我希望用户能够使用拖放方法对其进行重新排序。 我正在为该列表视图使用 BaseAdapter。 我还没有找到它的教程。任何人都可以为我指出一些代码吗?

这是提供 DragDrop 的列表视图 link functionality.Check This link

将您的列表视图替换为

<com.terlici.dragndroplist.DragNDropListView
    android:id="@id/android:list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

在你的activityclass

DragNDropListView list = (DragNDropListView)findViewById(android.R.id.list);

DragNDropCursorAdapter adapter = new DragNDropCursorAdapter(context,
                       R.layout.row,
                       cursor,
                       new String[]{"text"},
                       new int[]{R.id.text},
                       R.id.handler);

list.setDragNDropAdapter(adapter);

它还提供了拖放界面,正是你想要的。

listView.setDropListener(onDrop);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
private DragSortListView.DropListener onDrop = new DragSortListView.DropListener() {
    @Override
    public void drop(int from, int to) {

        if (from != to) {
            // DragSortListView list = listView;
            YourModel item = adapter.getItem(from);
            adapter.remove(item);
            adapter.insert(item, to)
    }
};  

在baseadapter中添加以下方法

public void remove(YourModel item) {
    aryList.remove(item);
    notifyDataSetChanged();
}

public void insert(YourModel item, int position) {
    aryList.add(position, item);
    notifyDataSetChanged();
}

在 Xml 中:

<com.mobeta.android.dslv.DragSortListView
    android:id="@+id/lstvw"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:divider="@null"
    android:scrollbars="none"
    dslv:collapsed_height="1px"
    dslv:drag_enabled="true"
    dslv:drag_handle_id="@+id/drag_handle1"
    dslv:drag_scroll_start="0.33"
    dslv:drag_start_mode="onDown"
    dslv:float_alpha="0.6"
    dslv:remove_enabled="false"
    dslv:slide_shuffle_speed="0.3" />

使用 ListView 的拖放代码由 Google 团队 @ ListViewDraggingAnimation zip. There is a video explaining the internal code @ ListView Cell Dragging and Rearranging 的新手开发人员提供。 DynamicListView中的代码你不用看懂。

开始的示例代码:

StableArrayAdapter adapter = new StableArrayAdapter(this, R.layout.text_view, mCheeseList);
DynamicListView listView = (DynamicListView) findViewById(R.id.listview);

listView.setCheeseList(mCheeseList);
listView.setAdapter(adapter);
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

备注:

  1. 使用“this”对象调用 StableArrayAdapter 构造函数在 Activity 中有效。如果在 Fragment subclass 上,请使用 getContext() 或类似方法。
  2. ArrayList mCheeseList 就是一个例子。使用适合您的代码的另一个列表。就个人而言,我想使用我自己的自定义 class 而不是简单的 ArrayList
  3. 同样,如果您像我一样使用 Fragment,请使用 view.findViewById 而不是 findViewById 方法调用。
  4. 最后,也许最重要的是示例使用了流行的 ArrayAdapter subclass、StableArrayAdapter。这可以很容易地更改为使用 BaseAdapter subclass (适合您的代码)。您必须以某种方式将数据传递给 StableArrayAdapter,这是最主要的。有趣的是,在 StableArrayAdapter class 中唯一使用 ArrayAdapter 的代码是 getItem 方法调用。
  5. 我在 Whosebug Drag and Drop for listview of views 上找到了一个有趣的 BaseAdapter subclass 代码示例。这可能值得更多关注。

就我个人而言,这是我第一次实现拖放功能。该代码提供了一个带有一个 TextView 的相当简单的示例。我需要在我的布局中使用 3 个 UI 元素而不是一个来自定义它。我想我可以根据自己的需要自定义 Google 的示例代码,这是一个共同的目标。

我希望这篇 post 和我的笔记能对其他人有所帮助,因为拖放功能尚未开发到 Android SDK 中,并且非常需要一个。 祝你好运,玩得开心...Tommy Kwee

使用模型的数组列表。

private ArrayList<YourModel> albumList = new ArrayList<YourModel>();
//add item in your list.

DragSortListView listView = (DragSortListView) findViewById(R.id.lv_test);

ReorderAlbumAdapter adapter = new ReorderAlbumAdapter(this, albumList);

listView.setAdapter(adapter);
listView.setDropListener(onDrop);
listView.setRemoveListener(onRemove);

private DragSortListView.DropListener onDrop = new DragSortListView.DropListener() {
    @Override
    public void drop(int from, int to) {
        if (from != to) {
            AlbumModel item = adapter.getItem(from);
            adapter.remove(item);
            adapter.insert(item, to);
        }
    }
};



private DragSortListView.RemoveListener onRemove = new DragSortListView.RemoveListener() {
    @Override
    public void remove(int which) {
        adapter.remove(adapter.getItem(which));
    }
};

XML 对于列表视图是:

<com.mobeta.android.dslv.DragSortListView
            android:id="@+id/lv_test"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            dslv:collapsed_height="2dp"
            dslv:drag_enabled="true"
            dslv:drag_handle_id="@drawable/ic_launcher"
            dslv:drag_scroll_start="0.33"
            dslv:drag_start_mode="onMove"
            dslv:float_alpha="0.6"
            dslv:max_drag_scroll_speed="0.5"
            dslv:remove_enabled="true"
            dslv:remove_mode="flingRemove"
            dslv:slide_shuffle_speed="0.3"
            dslv:sort_enabled="true"
            dslv:track_drag_sort="false"
            dslv:use_default_controller="true" />

您应该为您的模型使用 arrayadapter。希望对你有帮助。