gpt4 book ai didi

java - RecyclerView 拖放式 - 文件和文件夹

转载 作者:行者123 更新时间:2023-11-30 10:22:15 24 4
gpt4 key购买 nike

现在我正在使用 RecyclerView 的 ItemTouchHelper.Callback 来重新排列我的回收站 View 中项目的位置。

但现在我需要的是文件和文件夹的功能。

场景是文件和文件夹都是同一个回收器 View 的项目。现在,当我将一个项目拖到一个文件夹上时,该文件夹不应从其位置移动,而是应该接受源 View 持有者作为其自身的子级。并且在其上释放一个项目时,源 View 持有者被隐藏并从回收者 View 中删除。虽然文件夹仍然存在。

我在谷歌上搜索了很多,但没能为 Recycler View 找到此类行为的单一实现。

如果有人指导我应该处理什么,以获得此功能。

谢谢。

最佳答案

使用 ItemTouchHelper.SimpleCallback。它扩展了 ItemTouchHelper.Callback,所以您可以用同样的方式将它附加到 RecyclerView。

您可以使用 ItemTouchHelper.SimpleCallback 提供的项目拖动的默认功能。您还可以获得一些通知,这些通知将允许您实现放入文件夹。

下面的类(class)将演示如何更改文件夹的背景颜色。一个项目将被放入该文件夹。

您应该在所描述的位置添加用于重新排序和删除项目的代码(例如在数据库中)。

class ItemDragAndDropCallback extends ItemTouchHelper.SimpleCallback {

private final RecyclerView recyclerView;

ItemDragAndDropCallback(RecyclerView recyclerView) {
// Choose drag and swipe directions
// Up and down is chosen for dragging
// Nothing is chosen for swiping
super(ItemTouchHelper.UP | ItemTouchHelper.DOWN, 0);
this.recyclerView = recyclerView;
}

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
int from = viewHolder.getAdapterPosition();
int to = target.getAdapterPosition();
// You can reorder items here
// Reorder items only when target is not a folder
recyclerView.getAdapter().notifyItemMoved(from, to);
return true;
}

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// You can react for swiping items here
// Do nothing in your case
}

// An item will be dropped into this folder
private View folder;

@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);

if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {

// Here you are notified that the drag operation began

if (folder != null) {
folder.setBackgroundResource(0); // Clear former folder background
folder = null;
}
} else if (actionState == ItemTouchHelper.ACTION_STATE_IDLE) {

// Here you are notified that the last operation ended

if (folder != null) {
// Set folder background to a color indicating
// that an item was dropped into it
folder.setBackgroundColor(
ContextCompat.getColor(
recyclerView.getContext(), android.R.color.holo_green_dark
)
);
// You can remove item from the list here and add it to the folder
// Remember to notify RecyclerView about it
recyclerView.getAdapter().notifyItemRemoved(viewHolder.getAdapterPosition());
}
}
}

// This method gets called a lot, so don't do any expensive operations here
@Override
public void onChildDraw(
Canvas c,
RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder,
float dX,
float dY,
int actionState,
boolean isCurrentlyActive
) {
if (actionState == ItemTouchHelper.ACTION_STATE_DRAG && isCurrentlyActive) {

// Here you are notified that the drag operation is in progress

if (folder != null) {
folder.setBackgroundResource(0); // Clear former folder background
folder = null;
}

float itemActualPosition = viewHolder.itemView.getTop() + dY + viewHolder.itemView.getHeight() / 2;

// Find folder under dragged item
for (int i = 0; i < recyclerView.getChildCount(); i++) {
View child = recyclerView.getChildAt(i);

// Exclude dragged item from detection
if (!child.equals(viewHolder.itemView)) {

// Accept folder which encloses item position
if (child.getTop() < itemActualPosition && itemActualPosition < child.getBottom()) {

folder = child;
// Set folder background to a color indicating
// that an item will be dropped into it upon release
folder.setBackgroundColor(
ContextCompat.getColor(
recyclerView.getContext(), android.R.color.holo_green_light
)
);
break;
}
}
}
}
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
}

当您将项目拖到文件夹上时,项目下的文件夹背景将为浅绿色。当您将项目放入文件夹时,其背景将为深绿色。

关于java - RecyclerView 拖放式 - 文件和文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47431169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com