github地址:https://github.com/zhangjianqingGitHub/WorkUtils
需求详情:
每个页面显示4个item
item长按拖动可排序
item四边等间距
最后效果
第一步: 每页显示4个item
1.设置每个item的高度为Recyclerview高度的一半
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
mContext = parent.getContext();
View view = LayoutInflater.from(mContext)
.inflate(R.layout.layout_main_recyclerview_item, parent, false);
MyViewHolder holder = new MyViewHolder(view);
int parentHeight = parent.getHeight();
GridLayoutManager.LayoutParams layoutParams = (GridLayoutManager.LayoutParams) holder.itemView.getLayoutParams();
layoutParams.height = (parentHeight / 2);
return holder;
}
第二步:每个item四边等距
1.给RecyclerView添加ItemDecoration
mMainRecyclerView.addItemDecoration(new MyItemDecoration(Utils.dpToPx(this, 20)));
public class MyItemDecoration extends RecyclerView.ItemDecoration {
private final int space;
public MyItemDecoration(int space) {
this.space = space;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
// RecyclerView.getChildLayoutPosition();
// RecyclerView.getChildAdapterPosition();
//注意这里 layoutposition和adapterposition的区别
// layoutposition 是页面可见的item的真实位置
// adapterposition 是数据源中item的位置,这里选择adapterposition是因为带回换位后边距不会错乱
int adapterPosition = parent.getChildAdapterPosition(view);
// 第一排不添加上边距
if (adapterPosition != 0 && adapterPosition != 1) {
outRect.top = space;
}
// 0,2,4等挨着左边的item
if (adapterPosition % 2 == 0) {
outRect.right = space / 2;
outRect.left = space;
} else {
outRect.left = space / 2;
outRect.right = space;
}
}
}
第三步:可拖动排序(ItemTouchHelper)
1.ItemTouchHelper关联RecyclerView
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new MyItemTouchHelperCallBack());
itemTouchHelper.attachToRecyclerView(mMainRecyclerView);
public class MyItemTouchHelperCallBack extends ItemTouchHelper.Callback {
@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
// if (recyclerView.getLayoutManager() instanceof GridLayoutManager){}
// 长按拖动,不可删除,可换位使用
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
// 轻扫轻按可滑动删除
// int swipeFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
return makeMovementFlags(dragFlags, 0);
}
// 拖拽 排序item时调用
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
int form = viewHolder.getAdapterPosition();
int to = target.getAdapterPosition();
boolean isMove = false;
MainAdapter adapter = (MainAdapter) recyclerView.getAdapter();
if (adapter != null && adapter.getData() != null) {
Collections.swap(adapter.getData(), form, to);
// adapter.notifyDataSetChanged();//这个方法也可解决拖动后item边距错位问题,但是会丢失拖动动画效果
adapter.notifyItemMoved(form, to);
isMove = true;
}
return isMove;
}
// 轻拖滑动出recyclerview后调用(可做删除item)
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
// null
}
}