2015-12-20 7 views
5

मैं अलग आइटम प्रकार के साथ एक सूची दृश्य है में ड्रॉप सूची दृश्य आइटमखींचें एक और आइटम

enter image description here

अब मैं खींचें फ़ाइल आइटम को लागू करने और इसे छोड़ करना चाहते हैं ' फ़ोल्डर आइटम में और स्रोत और लक्ष्य स्थिति प्राप्त करें। मैं कुछ ड्रैग सॉर्ट सूची दृश्य पुस्तकालयों की तरह खींचते समय लक्ष्य स्थिति (पुनर्व्यवस्थित) को बदलना नहीं चाहता हूं।

क्या कोई सुझाव शुरू करने के लिए कोई सुझाव है?

+0

समर्थन पुस्तकालय से 'ItemTouchHelper' के साथ आप 'RecyclerView'' का उपयोग कर सकते हैं? –

+0

अगर मैं 'रीसाइक्लर व्यू' में बदल जाता हूं, तो क्या ऐसा करना आसान है? – R4j

+0

यह होना चाहिए। मैंने इसका उपयोग नहीं किया है, लेकिन 'ItemTouchHelper' ड्रैग और ड्रॉप जोड़ने और 'रीसाइक्लिंग व्यू' को समर्थन को खारिज करने के लिए स्वाइप करने के लिए है। 'ItemTouchHelper' दस्तावेज़ों पर एक नज़र डालें, देखें कि क्या आप ऑनलाइन एक उदाहरण पा सकते हैं। मैं समझ नहीं पा रहा हूं कि आपका प्रश्न अधिक ध्यान क्यों नहीं दे रहा है, इस तरह की चीज करने के लिए वहां कई पुस्तकालय हैं। –

उत्तर

1

ListView से RecyclerView स्विच करने से चीजें बहुत आसान हो जाएंगी।

आप Styling Android पर पूरे लेख और पूरे कोड here.

इस कोड OnItemTouchListener का उपयोग करता है पता लगाने के लिए जब एक आइटम घसीटा जाना चाहिए पा सकते हैं। RecyclerView से ऊपर ImageView है जिसमें आइटम को सस्ती रूप से एनिमेट करने के लिए स्थानांतरित किया जा रहा है।

OnItemTouckListener (DragController.java):

public class DragController implements RecyclerView.OnItemTouchListener { 
    private RecyclerView recyclerView; 
    private ImageView overlay; 
    private final GestureDetectorCompat gestureDetector; 

    private boolean isDragging = false; 

    public DragController(RecyclerView recyclerView, ImageView overlay) { 
     this.recyclerView = recyclerView; 
     this.overlay = overlay; 
     GestureDetector.SimpleOnGestureListener longClickGestureListener = new GestureDetector.SimpleOnGestureListener() { 
      @Override 
      public void onLongPress(MotionEvent e) { 
       super.onLongPress(e); 
       isDragging = true; 
       dragStart(e.getX(), e.getY()); 
      } 
     }; 
     this.gestureDetector = new GestureDetectorCompat(recyclerView.getContext(), longClickGestureListener); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { 
     if (isDragging) { 
      return true; 
     } 
     gestureDetector.onTouchEvent(e); 
     return false; 
    } 

    @Override 
    public void onTouchEvent(RecyclerView rv, MotionEvent e) { 
     int x = (int) e.getX(); 
     int y = (int) e.getY(); 
     View view = recyclerView.findChildViewUnder(x, y); 
     if (e.getAction() == MotionEvent.ACTION_UP) { 
      dragEnd(view); 
      isDragging = false; 
     } else { 
      drag(y, view); 
     } 
    } 

शुरू और खींचें (DragController.java) खत्म होने वाली:

:

private boolean isFirst = true; 
private static final int ANIMATION_DURATION = 100; 
private int draggingItem = -1; 
private float startY = 0f; 
private Rect startBounds = null; 

private void dragStart(float x, float y) { 
    View draggingView = recyclerView.findChildViewUnder(x, y); 
    View first = recyclerView.getChildAt(0); 
    isFirst = draggingView == first; 
    startY = (y - draggingView.getTop()); 
    paintViewToOverlay(draggingView); 
    overlay.setTranslationY(y - startY); 
    draggingView.setVisibility(View.INVISIBLE); 
    draggingItem = recyclerView.indexOfChild(draggingView); 
    startBounds = new Rect(draggingView.getLeft(), draggingView.getTop(), draggingView.getRight(), draggingView.getBottom()); 
} 

private void drag(int y, View view) { 
    overlay.setTranslationY(y - startY); 
} 

private void dragEnd(View view) { 
    overlay.setImageBitmap(null); 
    view.setVisibility(View.VISIBLE); 
    view.setTranslationY(overlay.getTranslationY() - view.getTop()); 
    view.animate().translationY(0f).setDuration(ANIMATION_DURATION).start(); 
} 

private void paintViewToOverlay(View view) { 
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(bitmap); 
    view.draw(canvas); 
    overlay.setImageBitmap(bitmap); 
    overlay.setTop(0); 
} 

कोड द्वारा Mark Allison on StylingAndroid.

संपादित लिखा है

लेकिन मैं जब खींच आइटम की स्थिति को प्राप्त करने के लिए पता नहीं कैसे अंत

जवाब स्टाइलिंग Android पर part 7 में स्थित है।

View view = recyclerView.findChildViewUnder(0, y); 

और कैसे मैं फ़ोल्डर और हैडर आइटम पर खींचें निष्क्रिय कर सकते हैं? बस फ़ाइल आइटम खींचने की अनुमति दें?

आप एकाधिक व्यू टाइप (फ़ाइल, फ़ोल्डर & शीर्षलेख) का उपयोग कर ऐसा कर सकते हैं। फिर आप केवल getItemViewTypeDragController में फ़ाइलों के लिए आंदोलन शुरू करने के लिए उपयोग कर सकते हैं।

+0

धन्यवाद। मैं इसे करने की कोशिश की। लेकिन मुझे नहीं पता कि ड्रैगिंग खत्म होने पर आइटम की स्थिति कैसे प्राप्त करें। और मैं 'फ़ोल्डर' और 'शीर्षलेख' आइटम पर ड्रैग को कैसे अक्षम कर सकता हूं? बस 'फाइल' आइटम खींचने की अनुमति दें? – R4j

+0

@ आर 4j ने मेरा जवाब संपादित किया – LordRaydenMK

+0

यह काम करता है। तुम मेरे हीरो हो, आदमी। आपको बहुत - बहुत धन्यवाद! – R4j

संबंधित मुद्दे