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
में फ़ाइलों के लिए आंदोलन शुरू करने के लिए उपयोग कर सकते हैं।
समर्थन पुस्तकालय से 'ItemTouchHelper' के साथ आप 'RecyclerView'' का उपयोग कर सकते हैं? –
अगर मैं 'रीसाइक्लर व्यू' में बदल जाता हूं, तो क्या ऐसा करना आसान है? – R4j
यह होना चाहिए। मैंने इसका उपयोग नहीं किया है, लेकिन 'ItemTouchHelper' ड्रैग और ड्रॉप जोड़ने और 'रीसाइक्लिंग व्यू' को समर्थन को खारिज करने के लिए स्वाइप करने के लिए है। 'ItemTouchHelper' दस्तावेज़ों पर एक नज़र डालें, देखें कि क्या आप ऑनलाइन एक उदाहरण पा सकते हैं। मैं समझ नहीं पा रहा हूं कि आपका प्रश्न अधिक ध्यान क्यों नहीं दे रहा है, इस तरह की चीज करने के लिए वहां कई पुस्तकालय हैं। –