2

我想拖放回收器视图项目图像到我的图像视图(这是在主布局)。我怎样才能做到这一点?拖放回收器查看项目到图像视图

我使用下面的代码来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) { 

    } 
} 

请帮我一些示例或代码 感谢。

回答

1

查看我的答案Drag View and Drop it on RecyclerView item Android
但是你必须在这里做一些改变。在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; 
    } 
}); 

EDIT 2
好这里的一个解释。当你将一个监听器分配给一个视图时,你告诉你想要监听拖动事件。当一个拖动事件开始时,侦听器的onDrag被触发,动作为DragEvent.ACTION_DRAG_STARTED。在这种情况下,在视图监听器中您想要放弃该项目的位置返回true,以告知此视图要抓取拖动项目。当视图被放在您正在听的视图上时onDrag再次被触发,并采取行动DragEvent.ACTION_DROP。在物品掉落的时候,你必须实现你想要做的逻辑。如果您想要更改imageview的图像源或更换imageview,则必须在DragEvent.ACTION_DROP的情况下实施替换逻辑。拖动事件和监听器只会告诉你,你正在拖动以及你放下的位置。所以其他任何逻辑都必须由你来完成。在我的情况下,我通知我的recyclerview适配器某些项目已更改。

+0

能否请您详细解释或提供一些我需要做的更改的代码? – Abhishek

+0

好的,我对答案做了一些编辑。您可以先删除已发布的代码,但您并不需要它。 –

+0

如果你想了解更多关于拖放工作的信息,请查看[android开发者网站](https://developer.android.com/guide/topics/ui/drag-drop.html) –