我有 ItemTouchHelper 类,它使用滑动和拖放来执行操作。但我想改变拖放行为。它应该交换 2 个元素的位置,第一个元素是我拖动的,另一个元素是放置在其上的。我想交换拖放位置的项目。不要改变两者之间所有项目的位置。
怎么做
这是我的拖放课程
public class ItemTouchHelper extends
androidx.recyclerview.widget.ItemTouchHelper.Callback {
private Drawable icon;
private Context context;
private ColorDrawable background;
private final ItemTouchHelperListener dragDropListener;
public ItemTouchHelper(Context context, Drawable icon,
ItemTouchHelperListener dragDropListener) {
this.icon = icon;
this.dragDropListener = dragDropListener;
this.context = context;
this.background = new ColorDrawable(context.getResources().getColor(R.color.deleteItem));
}
@Override
public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
@NonNull RecyclerView.ViewHolder viewHolder,
float dX, float dY,
int actionState, boolean isCurrentlyActive) {
super.onChildDraw(c, recyclerView, viewHolder, dX,
dY, actionState, isCurrentlyActive);
View itemView = viewHolder.itemView; …Run Code Online (Sandbox Code Playgroud) java android drag-and-drop android-recyclerview itemtouchhelper
我们正在 RecyclerView 中实现 ItemTouchHelper,当我们在 RV 中向左滑动时,我们正在覆盖 onChildDraw,问题是,如果我有一个 X 大小的 RecyclerView,我尝试关闭 2、3、4 或5 个元素,唯一一个显示文本的是 List 中的第一个元素,但是,如果是图像,它工作得很好
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (viewHolder.getAdapterPosition() == -1)
return;
View itemView = viewHolder.itemView;
Paint paint = new Paint();
paint.setColor(Color.WHITE);
paint.setTextSize(40);
paint.setTextAlign(Paint.Align.CENTER);
String inbox = itemView.getContext().getResources().getString(R.string.sendinbox);
c.drawText(inbox, itemView.getRight() - 200, itemView.getHeight()/2, paint);
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
Run Code Online (Sandbox Code Playgroud) 如何在使用 ItemTouchHelper 删除 Recyclerview 项目之前显示确认对话框。我创建了 RecyclerView 并实现了基本的 ItemTouchHelper.Callback 类。但是,我不知道接下来要做什么。
我创建了下面的类并将其附加到 Recyclerview。刷出项目有效。但我想在项目移动之前显示确认对话框。
class SwipeController extends Callback {
public SwipeController( ) {
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
return makeMovementFlags(0, START);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
}
Run Code Online (Sandbox Code Playgroud) 我曾经ItemTouchHelper在recyclerview. 它工作正常。但它仅适用于长按。我需要这样做onTouch
ItemTouchHelper.Callback itemTouchHelperCallback = new ItemTouchHelper.Callback() {
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
Collections.swap(strings, viewHolder.getAdapterPosition(), target.getAdapterPosition());
adapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
//TODO
}
//defines the enabled move directions in each state (idle, swiping, dragging).
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG,
ItemTouchHelper.DOWN | ItemTouchHelper.UP | ItemTouchHelper.START | ItemTouchHelper.END);
}
};
Run Code Online (Sandbox Code Playgroud)
这是我使用的代码。请帮我!!!
我RecyclerView的布局是GridLayout3列。我正在使用ItemTouchHelper拖放GridLayout的RecyclerView。在我的适配器中,有一种方法onItemMove()可以通知我我已移动的物品。它只交换那些ArrayList我拖放过的项目。但是由于拖放,其他元素也会发生变化。我也想更新他们在中的职位ArrayList。
这是我的Recyclerview的适配器:
public class GridAdapter extends RecyclerView.Adapter<GridAdapter.MyViewHolder> implements com.sagar.quizdemo.helper.ItemTouchHelperAdapter {
String[] str = {"Level 1", "Level 2", "Level 3", "Level 4", "Level 5", "Level 6", "Level 7", "Level 8", "Level 9"};
List<String> itemList, actualList;
LayoutInflater inflater;
Context context;
private final OnStartDragListener mDragStartListener;
public GridAdapter(Context context, OnStartDragListener dragStartListener) {
this.context = context;
mDragStartListener = dragStartListener;
inflater = LayoutInflater.from(context);
itemList = new ArrayList<>();
actualList = new ArrayList<>(Arrays.asList(str));
} …Run Code Online (Sandbox Code Playgroud) java android drag-and-drop android-recyclerview itemtouchhelper
我在 SwipeRefreshLayout 中使用了 recyclerview,当我开始滑动以删除我的回收器视图项时,它将主动拉动以刷新。我想在开始滑动时禁用拉动刷新并启用完整的滑动。我使用 ItemTouchHelper 类来检测滑动动作
这是我的 .xml 文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
Run Code Online (Sandbox Code Playgroud)
而且,这个Java文件,
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
}
}).attachToRecyclerView(recyclerView);
Run Code Online (Sandbox Code Playgroud) android android-recyclerview recyclerview-layout itemtouchhelper
我想将项目拖到我的水平 recyclerview 上(不仅在 recyclerview 的范围内),当放下一个项目时,它会通过动画移动到新位置。如何使用 ItemTouchHelper.Callback 实现这一点?
所以我在 recyclerview rv 上实现了这个 itemtouchhelper.simple 回调。
现在在这个 rv 中,我根据内容类型将 2 种布局设置为一行。
所以当我在 rv 上设置这个 touchhelper 时,它正在这两种布局上实现,即使我不想这样做。我只想将这种滑动应用于这种布局的一种类型。
ItemTouchHelper.SimpleCallback ith = new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
if(viewHolder.itemView.findViewById(R.id.messageholder_from) != null)
{
Log.d("texts", "onSwiped: "+viewHolder.itemView.findViewById(R.id.messageholder_from).findViewById(R.id.crfrom));
}
adapter.notifyDataSetChanged();
}
};
new ItemTouchHelper(ith).attachToRecyclerView(rv);
Run Code Online (Sandbox Code Playgroud)
如您所见,此代码我只想在包含此 messageholder_from 子项的行上实现滑动,否则我不想实现滑动。
有什么方法可以删除另一个子 messageholder_to 上的滑动动画和侦听器。
我的应用程序根据消息 ID 显示 to_layout 或 from_layout。
感谢您提供任何帮助。
我的 RecyclerView 使用 ItemTouchHelper 启用向右滑动功能,如下所示
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(createHelperCallback());
itemTouchHelper.attachToRecyclerView(myRecyclerView);
private ItemTouchHelper.Callback createHelperCallback() {
return new ItemDragSwipeCallback(this, R.color.swipe_delete, R.drawable.ic_delete_black_24dp,
0, ItemTouchHelper.RIGHT, new ItemDragSwipeCallback.OnTouchListener() {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
// delete code
}
});
}
Run Code Online (Sandbox Code Playgroud)
自定义 ItemTouchHelper.SimpleCallback
public class ItemDragSwipeCallback extends ItemTouchHelper.SimpleCallback {
private Drawable mIcon;
private final ColorDrawable mBackground;
public interface OnTouchListener {
boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target);
void onSwiped(RecyclerView.ViewHolder …Run Code Online (Sandbox Code Playgroud)