可以设置长按以移动内部标签,标签可以流畅运动且不会超出上下边界。
部分代码需要替换。
public class PageManagePopupWindow extends PopupWindow {
private Context context;
private List<PageInfo> fixedData = new ArrayList<>();
private List<PageInfo> mutableData = new ArrayList<>();
private BaseAdapter fixedAdapter;
private BaseBeanAdapter manageAdapter;
private final static int VIBRATE_TIME = 90;
private final static String FIXED_TEXT_COLOR = "#A0ACB5";
public PageManagePopupWindow(Context context, int spanCount, int width, int height) {
this.context = context;
//注册PageInfo
LayoutCenter.getInstance().registerItemBuilder(PageInfo.class, new ItemBuilder<PageInfo>() {
@Override
public BaseItem build(Context context, PageInfo bean) {
return new PageManageItemView(context, bean);
}
});
//初始化内部布局
View contentView = LayoutInflater.from(context).inflate(R.layout.view_page_manage_window_view, null);
//设置RecyclerView
RecyclerView fixedList = contentView.findViewById(R.id.page_fixed_list);
fixedList.setLayoutManager(new GridLayoutManager(context, spanCount));
fixedAdapter = new BaseAdapter(context);
fixedList.setAdapter(fixedAdapter);
RecyclerView manageList = contentView.findViewById(R.id.page_manage_list);
manageList.setLayoutManager(new GridLayoutManager(context, spanCount));
manageAdapter = new BaseBeanAdapter(context);
manageList.setAdapter(manageAdapter);
//设置ItemTouchHelper
ItemTouchHelper helper = new ItemTouchHelper(new PageManageCallback());
helper.attachToRecyclerView(manageList);
//设置按钮
contentView.findViewById(R.id.page_manage_confirm_button).setOnClickListener(new SafeClickListener() {
@Override
protected void onClicked(View v) {
dismiss();
}
});
contentView.findViewById(R.id.page_manager).setOnClickListener(new SafeClickListener() {
@Override
protected void onClicked(View v) {
dismiss();
}
});
this.setContentView(contentView);
this.setWidth(width);
this.setHeight(height);
//this.setFocusable(true);
this.setOutsideTouchable(true);
this.setAnimationStyle(R.style.page_manage_window_anim);
}
public void setFixedList(@NonNull List<PageInfo> data) {
fixedAdapter.clear();
for (PageInfo temp : data) {
if (temp.isFixed()) {
fixedAdapter.addItem(new PageManageItemView(context, temp, FIXED_TEXT_COLOR));
}
}
fixedAdapter.notifyDataSetChanged();
}
public void setManageList(@NonNull List<PageInfo> data) {
manageAdapter.refreshBeans(data);
}
public void setData(List<PageInfo> data) {
fixedData.clear();
mutableData.clear();
for (PageInfo temp : data) {
if (temp.isFixed()) {
fixedData.add(temp);
} else {
mutableData.add(temp);
}
}
setFixedList(fixedData);
setManageList(mutableData);
}
@NonNull
public List<PageInfo> getData() {
List<PageInfo> res = new ArrayList<>();
res.addAll(fixedData);
res.addAll(mutableData);
return res;
}
class PageManageCallback extends ItemTouchHelper.Callback {
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int start = viewHolder.getAdapterPosition();
int end = target.getAdapterPosition();
recyclerView.getAdapter().notifyItemMoved(start, end);
swap(mutableData, start, end);
return true;
}
@Override
public boolean isLongPressDragEnabled() {
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
VibrateUtils.vibrate(VIBRATE_TIME);
}
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
//viewHolder.itemView.setBackgroundColor(0);
}
//防止越出边界
@Override
public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
float topY = viewHolder.itemView.getTop() + dY;
float bottomY = topY + viewHolder.itemView.getHeight();
if (topY < 0) {
dY = 0;
} else if (bottomY > recyclerView.getHeight()) {
dY = recyclerView.getHeight() - viewHolder.itemView.getHeight() - viewHolder.itemView.getTop();
}
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
private void swap(List<PageInfo> list, int start, int end) {
if (ObjectUtils.isEmpty(list) || list.size() <= 1) {
return;
}
if (start < end) {
if (start >= (list.size() - 1)) {
return;
}
PageInfo temp = list.get(start);
int startIndex = start + 1;
for (int i = 0; i < end - start; i += 1) {
Collections.swap(list, startIndex, startIndex - 1);
startIndex += 1;
}
list.set(startIndex - 1, temp);
} else if (start > end) {
if (start <= 0) {
return;
}
PageInfo temp = list.get(start);
int startIndex = start - 1;
for (int i = 0; i < start - end; i += 1) {
Collections.swap(list, startIndex, startIndex + 1);
startIndex -= 1;
}
list.set(startIndex + 1, temp);
}
}
}
}