ItemTouchHelper是谷歌提供的用于实现Recyclerview 拖拽效果的帮助类,今天我们来学习下它的基本用法
首先ItemTouchHelper需要实现它的一个内部抽象类CallBack
public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
private IMoveAndSwipeCallback iMoveAndSwipeCallback;
public void setiMoveAndSwipeCallback(IMoveAndSwipeCallback iMoveAndSwipeCallback) {
this.iMoveAndSwipeCallback = iMoveAndSwipeCallback;
}
/**
* 设置拖拽和item滑动的可支持方向
*
* @param recyclerView
* @param viewHolder
* @return
*/
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
//支持上下拖拽
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
//item支持左滑
final int swipeFlags = ItemTouchHelper.LEFT;
return makeMovementFlags(dragFlags, swipeFlags);
}
/**
* 拖拽结束后(手指抬起)会回调的方法
*
* @param recyclerView
* @param viewHolder 手指拖拽的item
* @param viewHolder1 移动到的item
* @return
*/
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
if (iMoveAndSwipeCallback != null) {
iMoveAndSwipeCallback.onMove(viewHolder.getAdapterPosition(), viewHolder1.getAdapterPosition());
}
return true;
}
/**
* 侧滑回调
*
* @param viewHolder
* @param swipeDir 方向
*/
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int swipeDir) {
if (iMoveAndSwipeCallback != null) {
iMoveAndSwipeCallback.onSwiped(viewHolder.getAdapterPosition());
}
}
}
主要用到三个方法,getMovementFlags方法用于确定支持的拖拽方向和侧滑方向,onMove方法是拖拽结束后(手指抬起)会回调的方法,onSwiped则是侧滑回调,我这边还用了一个接口来给外部调用监听onMove和onSwiped
/**
* 拖拽和侧滑抽象接口
*/
public interface IMoveAndSwipeCallback {
void onMove(int prePosition, int postPosition);
void onSwiped(int position);
}
接下是我们在Activity中给RecyclerView设置ItemTouchHelper
public class ItemTouchHelperActivity extends AppCompatActivity implements IMoveAndSwipeCallback {
RecyclerView rv;
private List<String> strings;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_item_touch_helper);
rv = findViewById(R.id.rv);
rv.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
rv.addItemDecoration(new MyDecoration(this, MyDecoration.HORIZONTAL_LIST));
initData();
MyAdapter myAdapter = new MyAdapter(this);
rv.setAdapter(myAdapter);
//给RecyclerView设置ItemTouchHelper
ItemTouchHelperCallback itemTouchHelperCallback = new ItemTouchHelperCallback();
itemTouchHelperCallback.setiMoveAndSwipeCallback(this);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemTouchHelperCallback);
itemTouchHelper.attachToRecyclerView(rv);
}
private void initData() {
strings = new ArrayList<>();
for (int i = 0; i < 20; i++) {
strings.add(String.valueOf(i));
}
}
@Override
public void onMove(int prePosition, int postPosition) {
Collections.swap(strings, prePosition, postPosition);
if (rv.getAdapter() != null) {
rv.getAdapter().notifyItemMoved(prePosition, postPosition);
}
}
@Override
public void onSwiped(int position) {
strings.remove(position);
if (rv.getAdapter() != null) {
rv.getAdapter().notifyItemRemoved(position);
}
}
class MyAdapter extends RecyclerView.Adapter {
private Context context;
public MyAdapter(Context context) {
this.context = context;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
return new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_text, viewGroup, false));
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
MyViewHolder myViewHolder = (MyViewHolder) viewHolder;
myViewHolder.tv.setText(strings.get(i));
}
@Override
public int getItemCount() {
return strings.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
public TextView tv;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
tv = itemView.findViewById(R.id.tv);
}
}
}
}
最后效果:
![](https://img.haomeiwen.com/i6288115/a1bb849e5f4e98c8.gif)
ItemTouchHelper.gif
网友评论