【问题标题】:How to do swipe to delete cardview in android using support library如何使用支持库在android中滑动删除cardview
【发布时间】:2014-10-17 10:22:37
【问题描述】:

您好,我正在使用支持库 android.support.v7.widget.CardView 在我的 android 应用程序中实现 cardview 功能。我也想实现滑动删除功能。

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_gravity="center"
    android:layout_width="200dp"
    android:layout_height="200dp"
    card_view:cardCornerRadius="4dp">

    <TextView
        android:id="@+id/info_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.v7.widget.CardView>

如何实现滑动删除功能呢?

提前致谢。

【问题讨论】:

  • github.com/gabrielemariotti/cardslib,看看这个库。它使用了一个可能有帮助的 onSwipeDismissListener。
  • @AmaJayJB true - 但这是 minSDK 14 - 支持较低..
  • @AmaJayJB 我没有使用那个库。我正在使用谷歌在支持库中引入的 cardview 概念
  • @Williams 你搞定了吗?如果是,请告诉如何。谢谢

标签: android android-support-library


【解决方案1】:

我调整了 romannurik's Android-SwipeToDismiss 来做到这一点。

The code is on github 带有一个示例应用程序,包括:

  • RecyclerView.OnItemTouchListener 的子类,它侦听触摸事件并检测项目何时被滑动,并相应地对其进行动画处理。
  • 调用SwipeListener 是为了了解是否可以取消项目并在取消项目时再次调用。

要使用它,请按照 github 上的说明进行操作,或者只需将 SwipeableRecyclerViewTouchListener 类复制到您的项目中并像这样使用它:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mItems = new ArrayList<>(30);
    for (int i = 0; i < 30; i++) {
        mItems.add(String.format("Card number %2d", i));
    }

    mAdapter = new CardViewAdapter(mItems);

    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mRecyclerView.setAdapter(mAdapter);

    SwipeableRecyclerViewTouchListener swipeTouchListener =
            new SwipeableRecyclerViewTouchListener(mRecyclerView,
                    new SwipeableRecyclerViewTouchListener.SwipeListener() {
                        @Override
                        public boolean canSwipe(int position) {
                            return true;
                        }

                        @Override
                        public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions) {
                            for (int position : reverseSortedPositions) {
                                mItems.remove(position);
                                mAdapter.notifyItemRemoved(position);
                            }
                            mAdapter.notifyDataSetChanged();
                        }

                        @Override
                        public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) {
                            for (int position : reverseSortedPositions) {
                                mItems.remove(position);
                                mAdapter.notifyItemRemoved(position);
                            }
                            mAdapter.notifyDataSetChanged();
                        }
                    });

    mRecyclerView.addOnItemTouchListener(swipeTouchListener);
}

【讨论】:

  • 如何删除一个元素?您似乎没有提及您滑动以将其删除的适配器/元素。
  • 解决了!只需调用适配器并在 for 循环中删除所需的元素。
  • @uj- for 循环只删除刷过的项目。如果您查看在项目被解除时执行的代码 (github.com/brnunes/SwipeableRecyclerView/blob/master/lib/src/…),您可以看到项目被添加到缓冲区,因为解除仅在动画结束时完成。在我的测试中,我从来没有遇到过reverseSortedPositions 的数组有多个元素的情况,但是由于该代码是原始实现的一部分,所以我把它留在那里。
  • @uj- 至于如何以编程方式关闭项目,您应该能够在删除项目时添加动画。这个问题可能会有所帮助:stackoverflow.com/questions/26724964/…。否则,您可以找出要关闭的项目的位置并模拟滑动事件:stackoverflow.com/questions/5867059/….
  • @brnunes 正是我已经解决了其中的一部分。在 SwipeableRecyclerView 中,将第一次滑动时的布局更改为撤消卡片并在第二次滑动时将其移除。感谢您的想法
【解决方案2】:

在 android support v7 API 中有一种滑动删除手势的新方法。 类名叫做ItemTouchHelper。

先生。 Paul Burke 写了一个关于如何实现此功能的惊人示例。 请参阅此link。

【讨论】:

  • 已验证此作品。也许添加一些最小的示例代码来改进这个答案?
【解决方案3】:

添加是因为这是第一个结果。

我正在寻找类似的东西并且遇到了一些问题,检查了前两个答案,但这是我发现实现的最简单的答案。只需将其粘贴在活动中并将 itemlist/adapater/recyclerview 更改为您的名称即可。

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new 
ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        return false;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {

        ItemList.remove(viewHolder.getAdapterPosition());
        Adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
    }

    @Override
    public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) {
        super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);
    }
};

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(RecyclerViewer);

在这里找到:codeproject

【讨论】:

    【解决方案4】:

    https://github.com/journaldev/journaldev/tree/master/Android/AndroidRecyclerViewSwipeToDelete去帮你

    RecyclerView.OnItemTouchListener 的子类,它监听触摸事件并检测项目何时被滑动,并相应地对其进行动画处理。 调用 SwipeListener 是为了了解项目是否可以被解除,并在项被解除时再次调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多