【问题标题】:Add swipe right to delete ListView item添加向右滑动以删除 ListView 项
【发布时间】:2020-10-02 22:59:44
【问题描述】:

我有一个使用自定义适配器(扩展 BaseAdapter)的 ListView。如何添加滑动删除手势?

我想使用与 gmail 应用程序相同的功能。

【问题讨论】:

标签: android listview swipe


【解决方案1】:

最简单的方法是将您的ListView 移至RecyclerView 并使用带有单列的GridLayoutManager。它看起来一样,但允许您使用ItemTouchHelper 滑动以关闭。

     recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
     recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 1));

     recyclerView.setAdapter(adapter);


    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
            // Remove item from backing list here
            adapter.notifyDataSetChanged();
        }
    });

    itemTouchHelper.attachToRecyclerView(recyclerView);

【讨论】:

  • 是的,您必须将 ListView 更改为 RecyclerView,更改适配器基类类型,然后为数据创建一个或多个 Handler。
  • 我已经做到了,但是现在我在recycleview中有滚动,我不想滚动我已经有了scrollview可以删除滚动吗?
  • 我已经解决了滚动问题,我的适配器是 RecyclerView.Adapter,如果我想要从位置返回项目的方法我该怎么做?
  • 我想在 RecyclerView.Adapter 中创建我的自定义方法 delete 但我有一个问题,在我从 ArrayList 中删除项目之后,我调用 notifyDataSetChanged() 或我调用 notifyItemRemoved() ?
  • Removed 可能是更好的选择,这样适配器就知道它必须重绘哪些位置。 notifyDataSetChanged 将强制它重绘屏幕上的任何内容。
【解决方案2】:

你可以使用lib ::

SwipeMenuListView

【讨论】:

  • 此仓库已弃用
【解决方案3】:

已接受的翻译为 Kotlin 的答案:

val itemTouchHelper =  ItemTouchHelper(object: ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {
    override fun onMove(
        recyclerView: RecyclerView,
        viewHolder: RecyclerView.ViewHolder,
        target: RecyclerView.ViewHolder
    ): Boolean {
        TODO("Not yet implemented")
    }

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
            todoListAdapter.notifyDataSetChanged()
    }

})
this.runOnUiThread {
    itemTouchHelper.attachToRecyclerView(recyclerView)
}

【讨论】:

    【解决方案4】:

    我发现的最简单的方法是在 StatefullWidget 中使用 ListView.builder 并将子组件包装在 Dismissible 组件中:

    ListView.builder(
      itemCount: sampleList.length, //number of items on the list
      itemBuilder: (BuildContext context, int index) {
          return Dismissible(
            key: Key(sampleList[index]), //unique key string for each element (in this case each string is unique)
            onDismissed: (direction) {
              setState(() {
                sampleList.removeAt(index); //remove list element at given index and repaint
              });
            },
            child: child: Text('${sampleList[index]}'), //what to display form the list
          );
      },
    );
    

    您可以检查/复制下面的代码作为工作示例,并将其作为子组件传递给组件:

    import 'package:flutter/material.dart';
    
    class DismissibleList extends StatefulWidget {
      @override
      _DismissibleListState createState() => _DismissibleListState();
    }
    
    class _DismissibleListState extends State<DismissibleList> {
      @override
      Widget build(BuildContext context) {
        List<String> sampleList = ['aa', 'bb', 'cc']; // the list of elements
        return ListView.builder(
            itemCount: sampleList.length, //number of items on the list
            itemBuilder: (BuildContext context, int index) {
                return Dismissible(
                  key: Key(sampleList[index]), //unique key string for each element (in this case each string is unique)
                  onDismissed: (direction) {
                    setState(() {
                      sampleList.removeAt(index); //remove list element at given index and repaint
                    });
                  },
                  child: child: Padding(
                    padding: EdgeInsets.all(16.0), // just to help the visual
                    child: Text('${sampleList[index]}'),
                  ) //what to display form the list
                );
            },
          );
      }
    }
    

    【讨论】:

    • 这是颤振的答案。但是问题针对的是原生 android
    猜你喜欢
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多