【发布时间】:2020-10-02 22:59:44
【问题描述】:
我有一个使用自定义适配器(扩展 BaseAdapter)的 ListView。如何添加滑动删除手势?
我想使用与 gmail 应用程序相同的功能。
【问题讨论】:
-
问题是为了实现这个库我必须重写所有.....
我有一个使用自定义适配器(扩展 BaseAdapter)的 ListView。如何添加滑动删除手势?
我想使用与 gmail 应用程序相同的功能。
【问题讨论】:
最简单的方法是将您的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);
【讨论】:
notifyDataSetChanged 将强制它重绘屏幕上的任何内容。
你可以使用lib ::
【讨论】:
已接受的翻译为 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)
}
【讨论】:
我发现的最简单的方法是在 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
);
},
);
}
}
【讨论】: