我想拖放回收器视图项目映像到我的图像视图(在主布局中)。我该如何实现?
我正在使用以下代码到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) {
}
}
请帮助我提供一些示例或代码谢谢。
在此处查看我的答案,然后将其放在recyclerview项目Android中。
但是您必须在这里进行一些更改。将longClickListener
设置为回收器视图iteView
在您的onCreateViewHolder
方法中,您将其充气。在那里,您开始拖动。将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
发射。在这种情况下,在视图上,您要丢弃您返回的项目,以说明此视图想要捕获拖动项目。当视图在视图上删除视图时,您正在收听onDrag
再次通过操作DragEvent.ACTION_DROP
发射。在那里,您必须实现逻辑,当该项目删除时要做什么。如果要更改ImageView的映像源或替换ImageView,则必须在DragEvent.ACTION_DROP
情况下实现替换逻辑。拖动事件和听众只会告诉您您正在拖动以及在哪里掉落。因此,您必须由您完成任何其他逻辑。就我而言,我通知了我的回收库适配器,某些项目已更改。