文章目录
- 前言
- 一、效果图
- 二、实现步骤
- 1.xml布局
- 2.activity代码
- 3.adapter
- 总结
前言
随着需求的变化,很多地方需要加拖动改变顺序的需求,用RecyclerView就可以实现列表拖动排序,列如像朋友圈图片拖动排序,或者音乐播放器列表拖动排序,我这里没有弄GIF图,截图就是正在拖动的效果。
一、效果图
二、实现步骤
1.xml布局
代码如下(示例):
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="12dp"
android:layout_marginTop="10dp"
android:layout_marginRight="5dp"
android:layout_marginBottom="12dp"
android:overScrollMode="never" />
2.activity代码
代码如下(示例):
private lateinit var list_view: RecyclerView
private lateinit var listbean: MutableList<String>
private lateinit var adapter: IntelligentReplyAdapter
//一排显示多个需要全局定义,不然每次排序后都要加载一次空隙就越来越大,正常列表显示一个不需要定义这个
private lateinit var itemDecoration: RecyclerView.ItemDecoration
itemDecoration = SpacesItemDecoration(20)
listbean = mutableListOf()
for (i in 1..6) {
listbean.add("$i 号回复组名称")
}
list_view = findViewById(R.id.list_view)
list_view.layoutManager = LinearLayoutManager(
this,
LinearLayoutManager.VERTICAL,
false
) //竖向显示
// 设置LayoutManager为GridLayoutManager,每行3个item -->一排显示多个需要
//val layoutManager = GridLayoutManager(this, 3)
//list_view.addItemDecoration(itemDecoration)
//list_view.layoutManager = layoutManager
adapter = IntelligentReplyAdapter(listbean, this)
list_view.adapter = adapter
//RecyclerView实现拖拽实现 设置ItemTouchHelper
val callback: ItemTouchHelper.Callback = object : ItemTouchHelper.Callback() {
override fun getMovementFlags(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder
): Int {
val dragFlags =
ItemTouchHelper.UP or ItemTouchHelper.DOWN or ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
return makeMovementFlags(dragFlags, 0) // 允许上下左右拖拽
}
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
val toPositioncc = viewHolder.adapterPosition
// 检查目标位置是否是最后一个位置
if (toPositioncc == (adapter.itemCount - 1)) {
return false // 不允许移动到最后一个位置
}
val toPosition = viewHolder.adapterPosition
val fromPosition = target.adapterPosition
// 交换数据集中的元素位置
Collections.swap(listbean, fromPosition, toPosition)
// 通知Adapter数据已更改
adapter.notifyItemMoved(fromPosition, toPosition)
return true
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
// 不处理滑动事件,如果需要可以处理删除逻辑
}
}
val itemTouchHelper = ItemTouchHelper(callback)
itemTouchHelper.attachToRecyclerView(list_view)
3.adapter
代码如下(item的xml布局就补贴了):
/**
* 作者:CaoLiulang
* ❤
* Date:2024/12/24
* ❤
* 模块 智能回复adapter
*/
public class IntelligentReplyAdapter extends RecyclerView.Adapter<IntelligentReplyAdapter.ViewHolder> {
private List<String> list;
private Context context;
public IntelligentReplyAdapter(List<String> list, Context context) {
this.list = list;
this.context = context;
}
/**
* 加载更多
*
* @param mPageList
*/
public void setData(List<String> mPageList) {
try {
if (mPageList != null) {
int previousSize = 0;
try {
previousSize = list.size();
} catch (Exception e) {
previousSize = 0;
}
int sizez = previousSize + 2;
list.addAll(mPageList);
notifyItemRangeInserted(sizez, mPageList.size());
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.intelligentreply_item, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
/**
* 类似GetView
*
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(final ViewHolder holder, @SuppressLint("RecyclerView") final int position) {
holder.text_name.setText(list.get(position));
}
//添加元素,需要告诉UI线程布局的变动
public void update() {
notifyDataSetChanged();
}
/**
* 长度
*
* @return
*/
@Override
public int getItemCount() {
return list.size();
}
/**
* 初始化组件
*/
class ViewHolder extends RecyclerView.ViewHolder {
TextView text_name;
public ViewHolder(final View itemView) {
super(itemView);
text_name = itemView.findViewById(R.id.text_name);
}
}
总结
实现列表拖拽排序其实很简单,RecyclerView正常加载数据,然后去设置ItemTouchHelper就可以了,是不是很简单呢。