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) –