将 Recycler View 项目拖放到 Image View
Drag and Drop Recycler View item to Image View
我想将回收站视图项目图像拖放到我的图像视图(在主布局中)。我怎样才能做到这一点?
我正在使用下面的代码来处理 longItemClickRecyclerViewItem
images_recycler.addOnItemTouchListener(
new RecyclerItemClickListener(getActivity(), images_recycler ,new RecyclerItemClickListener.OnItemClickListener() {
@Override public void onItemClick(View view, int position) {
}
@Override
public void onItemLongClick(View view, int position) {
}
})
);
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener
{
public static interface OnItemClickListener
{
public void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
private OnItemClickListener mListener;
private GestureDetector mGestureDetector;
public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener)
{
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener()
{
@Override
public boolean onSingleTapUp(MotionEvent e)
{
return true;
}
@Override
public void onLongPress(MotionEvent e)
{
View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());
if(childView != null && mListener != null)
{
mListener.onItemLongClick(childView, recyclerView.getChildPosition(childView));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e)
{
View childView = view.findChildViewUnder(e.getX(), e.getY());
if(childView != null && mListener != null && mGestureDetector.onTouchEvent(e))
{
mListener.onItemClick(childView, view.getChildPosition(childView));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent){}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
请帮我举一些例子或代码
谢谢
在这里查看我的回答 .
但是你必须在这里做一些改变。在你的 onCreateViewHolder
方法中设置一个 longClickListener
到你的回收者视图 iteView
并膨胀它。在那里你开始拖动。将 onDragListener
设置为 ImageView
要放置的位置。
编辑
好的,我在这里添加一些代码。在您的回收器适配器的 onCreateViewHolder
中添加这些行:
@Override
public MemberHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.yourlayout, parent, false);
view.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ClipData.Item item = new ClipData.Item((CharSequence) view.getTag());
String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
ClipData dragData = new ClipData(view.getTag().toString(),
mimeTypes, item);
view.setVisibility(View.GONE);
HeptagonDragShadowBuilder myShadow = new HeptagonDragShadowBuilder(Heptagon.this, 1.1f);
if (VERSION.SDK_INT >= VERSION_CODES.N) {
view.startDragAndDrop(dragData, myShadow, null, 0);
} else {
view.startDrag(dragData, myShadow, null, 0);
}
return true;
}
});
return memberHolder;
}
在您要放置项目的图像视图中添加以下行:
imageView.setOnDragListener(new OnDragListener() {
@Override
public boolean onDrag(View view, DragEvent dragEvent) {
switch (dragEvent.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
// drag has started, return true to tell that you're listening to the drag
return true;
case DragEvent.ACTION_DROP:
// the dragged item was dropped into this view
Category a = items.get(getAdapterPosition());
a.setText("dropped");
notifyItemChanged(getAdapterPosition());
return true;
case DragEvent.ACTION_DRAG_ENDED:
// the drag has ended
return false;
}
return false;
}
});
编辑 2
好的,这是一个解释。当您将侦听器分配给视图时,您就是在告诉您要侦听拖动事件。当拖动事件开始时,侦听器的 onDrag 将被触发并执行操作 DragEvent.ACTION_DRAG_STARTED
。在这种情况下,在您想要放置项目的视图侦听器上,您 return true 告诉该视图想要捕获拖动的项目。当将视图拖放到您正在收听的视图上时,onDrag
会再次触发操作 DragEvent.ACTION_DROP
。在那里,您必须实现放下项目时要执行的逻辑。如果您想更改 imageview 的图像源或替换 imageview,您必须在 DragEvent.ACTION_DROP
情况下在那里实现替换逻辑。拖动事件和侦听器只会告诉您您正在拖动以及您正在放下的位置。所以任何其他逻辑都必须由你来完成。就我而言,我通知我的 recyclerview 适配器某些项目已更改。
我想将回收站视图项目图像拖放到我的图像视图(在主布局中)。我怎样才能做到这一点?
我正在使用下面的代码来处理 longItemClickRecyclerViewItem
images_recycler.addOnItemTouchListener(
new RecyclerItemClickListener(getActivity(), images_recycler ,new RecyclerItemClickListener.OnItemClickListener() {
@Override public void onItemClick(View view, int position) {
}
@Override
public void onItemLongClick(View view, int position) {
}
})
);
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener
{
public static interface OnItemClickListener
{
public void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
private OnItemClickListener mListener;
private GestureDetector mGestureDetector;
public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener)
{
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener()
{
@Override
public boolean onSingleTapUp(MotionEvent e)
{
return true;
}
@Override
public void onLongPress(MotionEvent e)
{
View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());
if(childView != null && mListener != null)
{
mListener.onItemLongClick(childView, recyclerView.getChildPosition(childView));
}
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e)
{
View childView = view.findChildViewUnder(e.getX(), e.getY());
if(childView != null && mListener != null && mGestureDetector.onTouchEvent(e))
{
mListener.onItemClick(childView, view.getChildPosition(childView));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent){}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
请帮我举一些例子或代码 谢谢
在这里查看我的回答
但是你必须在这里做一些改变。在你的 onCreateViewHolder
方法中设置一个 longClickListener
到你的回收者视图 iteView
并膨胀它。在那里你开始拖动。将 onDragListener
设置为 ImageView
要放置的位置。
编辑
好的,我在这里添加一些代码。在您的回收器适配器的 onCreateViewHolder
中添加这些行:
@Override
public MemberHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.yourlayout, parent, false);
view.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ClipData.Item item = new ClipData.Item((CharSequence) view.getTag());
String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
ClipData dragData = new ClipData(view.getTag().toString(),
mimeTypes, item);
view.setVisibility(View.GONE);
HeptagonDragShadowBuilder myShadow = new HeptagonDragShadowBuilder(Heptagon.this, 1.1f);
if (VERSION.SDK_INT >= VERSION_CODES.N) {
view.startDragAndDrop(dragData, myShadow, null, 0);
} else {
view.startDrag(dragData, myShadow, null, 0);
}
return true;
}
});
return memberHolder;
}
在您要放置项目的图像视图中添加以下行:
imageView.setOnDragListener(new OnDragListener() {
@Override
public boolean onDrag(View view, DragEvent dragEvent) {
switch (dragEvent.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
// drag has started, return true to tell that you're listening to the drag
return true;
case DragEvent.ACTION_DROP:
// the dragged item was dropped into this view
Category a = items.get(getAdapterPosition());
a.setText("dropped");
notifyItemChanged(getAdapterPosition());
return true;
case DragEvent.ACTION_DRAG_ENDED:
// the drag has ended
return false;
}
return false;
}
});
编辑 2
好的,这是一个解释。当您将侦听器分配给视图时,您就是在告诉您要侦听拖动事件。当拖动事件开始时,侦听器的 onDrag 将被触发并执行操作 DragEvent.ACTION_DRAG_STARTED
。在这种情况下,在您想要放置项目的视图侦听器上,您 return true 告诉该视图想要捕获拖动的项目。当将视图拖放到您正在收听的视图上时,onDrag
会再次触发操作 DragEvent.ACTION_DROP
。在那里,您必须实现放下项目时要执行的逻辑。如果您想更改 imageview 的图像源或替换 imageview,您必须在 DragEvent.ACTION_DROP
情况下在那里实现替换逻辑。拖动事件和侦听器只会告诉您您正在拖动以及您正在放下的位置。所以任何其他逻辑都必须由你来完成。就我而言,我通知我的 recyclerview 适配器某些项目已更改。