【问题标题】:Android List View with BaseAdapter Drag and Drop sort带有 BaseAdapter 拖放排序的 Android 列表视图
【发布时间】:2015-06-04 08:58:43
【问题描述】:

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

【问题讨论】:

  • 是的,我想要它通过拖放重新排列。
  • 查看DevBytes教程

标签: android listview android-listview drag-and-drop


【解决方案1】:

Google 团队 @ListViewDraggingAnimation zip 的一位初级开发人员为 使用 ListView 拖放提供了一组工作代码。有一个视频解释内部代码@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 构造函数可在活动中使用。如果在 Fragment 子类上,请使用 getContext() 或类似方法。
  2. ArrayList mCheeseList 就是一个例子。使用适合您的代码的另一个列表。就个人而言,我想使用我自己的自定义类而不是简单的 ArrayList
  3. 同样,如果您像我一样使用 Fragment,请使用 view.findViewById 而不仅仅是 findViewById 方法调用。
  4. 最后,也许最重要的是示例使用了流行的 ArrayAdapter 子类 StableArrayAdapter。这可以很容易地改为使用 BaseAdapter 子类(适合您的代码)。您必须以某种方式将数据传递给 StableArrayAdapter,这是主要的事情。有趣的是,在 StableArrayAdapter 类中使用 ArrayAdapter 的唯一代码是 getItem 方法调用。
  5. 我发现了一个有趣的 BaseAdapter 子类代码示例,它看起来不错 @ Stackoverflow Drag and Drop for listview of views。这可能值得更多关注。

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

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

【讨论】:

  • 感谢您没有在答案中提供过时的库参考。
【解决方案2】:

使用模型的数组列表。

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。希望对你有帮助。

【讨论】:

  • 我认为 com.mobeta.android.dslv.DragSortListView 类是 github.com/bauerca/drag-sort-listview 是否正确?不再维护。 :-(
  • 是的,图书馆不再维护,每个人都只用这个图书馆回答。
  • 我正在使用我的基本适配器并且没有这样的方法删除和插入所以我该如何使用它?
【解决方案3】:

这里是提供 DragDrop 功能的列表视图的链接。检查This link

替换你的列表视图
<com.terlici.dragndroplist.DragNDropListView
    android:id="@id/android:list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

在你的活动课上

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

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

【讨论】:

  • 它正在使用 DragNDropCursorAdapter,但我需要它与 baseAdapter。
  • DragNDropCusorAdapter 是一个扩展 ListAdapter 的自定义类。
  • 我希望它与 baseAdapter 一起使用,因为我已经用它实现了所有其他功能。
【解决方案4】:
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" />

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    相关资源
    最近更新 更多