实现RecyclerView的item拖拽、拖拽时的阴影效果、自定义分隔线
个人学习笔记,仅供参考。
/**
* 列表item的拖拽实现
*/
public class ItemDragActivity extends AppCompatActivity {
private String TAG = "JPush";
private TestAdapter mAdapter;
private RecyclerView mRecyclerView;
private ItemTouchHelper mItemTouchHelper;
private List<String> mList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_item_drag);
initView();
}
private void initView() {
mRecyclerView = findViewById(R.id.recyclerView);
mAdapter = new TestAdapter(this, initData());
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.addItemDecoration(new DividerGridItemDecoration(this,
dp2px(this, 45), dp2px(this, 20)));
mItemTouchHelper = new ItemTouchHelper(new DragItemHelperCallBack());
mItemTouchHelper.attachToRecyclerView(mRecyclerView);
}
private List<String> initData()
mList.add("小狗");
mList.add("猫咪");
mList.add("夜来香");
mList.add("水杯");
mList.add("傲娇");
mList.add("电脑");
mList.add("独家记忆");
mList.add("香水有毒");
mList.add("太多");
mList.add("爱的可能");
mList.add("说散就散");
mList.add("方圆几里");
return mList;
}
private class DragItemHelperCallBack extends ItemTouchHelper.Callback {
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
int dragFlags = 0;
if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN |
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
} else {
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
}
int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder,
@NonNull RecyclerView.ViewHolder target) {
// 被按下拖拽的position
int fromPosition = viewHolder.getAdapterPosition();
// 当前拖拽到的item的position
int toPosition = target.getAdapterPosition();
if (fromPosition < toPosition) {
for (int i = fromPosition; i < toPosition; i++) {
Collections.swap(mList, i, i+1);
}
} else {
for (int i = fromPosition; i > toPosition; i--) {
Collections.swap(mList, i, i-1);
}
}
RecyclerView.Adapter adapter = recyclerView.getAdapter();
if (adapter != null) {
// 必须从这里获取适配器,然后刷新
adapter.notifyItemMoved(fromPosition, toPosition);
}
return true;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
}
@Override