Android सूची दृश्य ड्रैग और ड्रॉप प्रकार


132

मेरे पास एक सूची में रिकॉर्ड्स की एक सूची है जो मैं चाहता हूं कि उपयोगकर्ता एक ड्रैग और ड्रॉप विधि का उपयोग करके पुन: सॉर्ट करने में सक्षम हो। मैंने इसे अन्य ऐप्स में लागू होते देखा है, लेकिन मुझे इसके लिए एक ट्यूटोरियल नहीं मिला है। यह ऐसा होना चाहिए जो दूसरों को भी चाहिए। किसी ने मुझे ऐसा करने के लिए कुछ कोड को इंगित कर सकते हैं?


1
मुझे यह ट्यूटोरियल मिला है जो एक सूची सूची दृश्य बनाने में मदद कर सकता है । मैंने अभी तक इसका परीक्षण नहीं किया है लेकिन वीडियो आशाजनक लगता है
एलेक्स

@ अकर्ड नो किडिंग, उन्होंने अभी भी इस सवाल का जवाब स्वीकार नहीं किया है, सालों बाद।
आर्टऑफवर्फ

@ArtOfWarfare मुझे लगता है कि किसी को यह पूछना चाहिए कि दुर्भाग्य से पूछने वाले के लिए कुछ हो सकता है ... आगे की गतिविधि को रोकना।
हेक्सोस्मो

1
@heycosmo यह संभव है ... उनके एसओ प्रोफ़ाइल के अनुसार, सवाल पूछने के महज एक महीने बाद मियांनेल दौरा किया। साथ ही, डीएसएलवी पर शानदार काम ... मैंने इसमें कुछ संशोधन किए हैं ताकि डुप्लिकेट आइटम पर डबल टैप करने और आइटम की छाया को बदलने की अनुमति दी जा सके क्योंकि यह चारों ओर घसीटा जाता है (मेरे आइटम प्रत्येक पर उनकी पंक्ति संख्या है, इसलिए मैं इसे बनाया ताकि पंक्ति संख्या अपडेट अपडेट हो सके क्योंकि इसे खींचा गया है।) वे अभी हैक किए गए हैं, कक्षा में बाकी सभी चीजों की तुलना में बहुत कम सुंदर हैं, इस प्रकार मैंने GitHub में बदलाव क्यों प्रस्तुत नहीं किए हैं।
ArtOfWarfare 4

github.com/bauerca/drag-sort-listview मैं इसका उपयोग कर रहा हूं और क्या यह संभव है कि सूची के ROW onLong पर क्लिक करें?
अचिन

जवाबों:


85

मैं पिछले कुछ समय से इस पर काम कर रहा हूं। सही होने के लिए कठिन है, और मैं दावा नहीं करता कि मैं करता हूं, लेकिन मैं इसके साथ खुश हूं। मेरा कोड और कई डेमो मिल सकते हैं

इसका उपयोग TouchInterceptor (जिस पर कोड आधारित है) के समान है, हालांकि महत्वपूर्ण कार्यान्वयन परिवर्तन किए गए हैं।

DragSortListView में आइटम को खींचते और फेरते समय चिकनी और पूर्वानुमानित स्क्रॉलिंग होती है। आइटम फेरबदल ड्रैगिंग / फ्लोटिंग आइटम की स्थिति के साथ बहुत अधिक सुसंगत हैं। विषम ऊंचाई सूची आइटम समर्थित हैं। ड्रैग-स्क्रॉलिंग अनुकूलन योग्य है (मैं एक लंबी सूची के माध्यम से तेजी से ड्रैग स्क्रॉलिंग प्रदर्शित करता हूं --- ऐसा नहीं है कि एक आवेदन दिमाग में आता है)। हेडर / फूटर्स का सम्मान किया जाता है। आदि।?? जरा देखो तो।


3
आपका समाधान एक आकर्षण की तरह काम करता है। बहुत बेहतर तो अन्य। आपके स्रोत कोड का लाइसेंस क्या है? अपाचे 2.0?
डेरियस बेकिंस्की

1
@heycosmo डेमो पर दिए गए विचारों का उपयोग करके अपने ऐप में एक लेआउट बनाते समय मेरे पास कुछ मुद्दे हैं। कई नामस्थान त्रुटि, क्या आप कृपया एक छोटा सा ब्लॉगपोस्ट कर सकते हैं कि आपके द्वारा प्रदान किए गए कोड का उपयोग कैसे करें?
daniel_c05

क्या कोड को इस तरह से संशोधित करने की संभावना है कि आइटम न केवल ड्रॉप पर सॉर्ट किए जाते हैं, जबकि आप अपने आइटम को उनके ऊपर खींच रहे हैं?
एलेक्स सेमीनीक

@heycosmo क्या आप अपने GitHub भंडार को सुलभ बना सकते हैं? यह ऑफ़लाइन लगता है ...
sdasdadas

8
बौर्का रेपो का रखरखाव अब नहीं किया जाता है। यह कांटा अधिक सक्रिय है: github.com/JayH5/drag-sort-listview
ecdpalma

21

अब यह आइटमटच हेल्पर के RecyclerViewसाथ लागू करने के लिए बहुत आसान है । बस विधि को ओवरराइड करें :onMoveItemTouchHelper.Callback

 @Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
    mMovieAdapter.swap(viewHolder.getAdapterPosition(), target.getAdapterPosition());
    return true;
}

इस पर बहुत अच्छा ट्यूटोरियल medium.com पर पाया जा सकता है: RecyclerView के साथ खींचें और स्वाइप करें


18

इस उत्तर को उन लोगों के उद्देश्य से जोड़ रहा हूँ जो इस बारे में गूगल करते हैं।

हाल ही में DevBytes ( ListView Cell Dragging and Rearranging) का एक एपिसोड था जो बताता है कि यह कैसे करना है

आप इसे यहां पा सकते हैं यहां नमूना कोड भी उपलब्ध है

यह कोड मूल रूप से क्या करता है कि यह सेल dynamic listviewके विस्तार के द्वारा बनाता है listviewजो सेल ड्रैगिंग और स्वैपिंग का समर्थन करता है। ताकि आप DynamicListViewअपने मूल के बजाय का उपयोग कर सकें ListView और यही है कि आपने ड्रैग और ड्रॉप के साथ एक सूची दृश्य लागू किया है।


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

मैंने वर्तमान 5.0 Android संस्करण पर उदाहरण की कोशिश की। अब इसमें कुछ समस्याएं हैं ...
टॉर्स्टन बी

@TCA हाँ, मुझे 5.0 पर भी मुद्दे मिले। कृपया मदद कीजिए।
मनु

6

DragListView काम करता है यह वास्तव में ऊंचा एनिमेशन जैसे कस्टम एनिमेशन के लिए बहुत अच्छा समर्थन के साथ साफ है। यह अभी भी बनाए रखा है और एक नियमित आधार पर अद्यतन किया जाता है।

यहाँ आप इसका उपयोग कैसे करें:

1: सर्वप्रथम श्रेणीबद्ध करने के लिए lib जोड़ें

dependencies {
    compile 'com.github.woxthebox:draglistview:1.2.1'
}

2: xml से सूची जोड़ें

<com.woxthebox.draglistview.DragListView
    android:id="@+id/draglistview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

3: ड्रैग श्रोता को सेट करें

mDragListView.setDragListListener(new DragListView.DragListListener() {
    @Override
    public void onItemDragStarted(int position) {
    }

    @Override
    public void onItemDragEnded(int fromPosition, int toPosition) {
    }
});

4: DragItemAdapter से अधिलेखित एक एडेप्टर बनाएं

public class ItemAdapter extends DragItemAdapter<Pair<Long, String>, ItemAdapter.ViewHolder>
    public ItemAdapter(ArrayList<Pair<Long, String>> list, int layoutId, int grabHandleId, boolean dragOnLongPress) {
        super(dragOnLongPress);
        mLayoutId = layoutId;
        mGrabHandleId = grabHandleId;
        setHasStableIds(true);
        setItemList(list);
}

5: एक दृश्यधारक को लागू करें जो DragItemAdapter.ViewHolder से फैलता है

public class ViewHolder extends DragItemAdapter.ViewHolder {
    public TextView mText;

    public ViewHolder(final View itemView) {
        super(itemView, mGrabHandleId);
        mText = (TextView) itemView.findViewById(R.id.text);
    }

    @Override
    public void onItemClicked(View view) {
    }

    @Override
    public boolean onItemLongClicked(View view) {
        return true;
    }
}

अधिक विस्तृत जानकारी के लिए https://github.com/woxblom/DragListView पर जाएं


5

मैंने पाया कि DragSortListView ने अच्छी तरह से काम किया, हालांकि इस पर शुरुआत करना आसान हो सकता था। इन-मेमोरी सूची के साथ एंड्रॉइड स्टूडियो में इसका उपयोग करने पर एक संक्षिप्त ट्यूटोरियल यहां दिया गया है:

  1. इसे build.gradleअपने ऐप के लिए निर्भरता में जोड़ें :

    compile 'asia.ivity.android:drag-sort-listview:1.0' // Corresponds to release 0.6.1
  2. ड्रैग हैंडल आईडी के लिए एक संसाधन बनाएं या उसमें जोड़कर values/ids.xml:

    <resources>
        ... possibly other resources ...
        <item type="id" name="drag_handle" />
    </resources>
  3. एक सूची आइटम के लिए एक लेआउट बनाएं जिसमें आपकी पसंदीदा ड्रैग हैंडल छवि शामिल है, और चरण 2 (जैसे drag_handle) में आपके द्वारा बनाई गई आईडी को इसकी आईडी असाइन करें ।

  4. कुछ इस तरह से एक DragSortListView लेआउट बनाएँ:

    <com.mobeta.android.dslv.DragSortListView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:dslv="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        dslv:drag_handle_id="@id/drag_handle"
        dslv:float_background_color="@android:color/background_light"/>
  5. ArrayAdapterएक getViewओवरराइड के साथ एक व्युत्पन्न सेट करें जो आपके सूची आइटम दृश्य को प्रस्तुत करता है।

        final ArrayAdapter<MyItem> itemAdapter = new ArrayAdapter<MyItem>(this, R.layout.my_item, R.id.my_item_name, items) { // The third parameter works around ugly Android legacy. http://stackoverflow.com/a/18529511/145173
            @Override public View getView(int position, View convertView, ViewGroup parent) {
                View view = super.getView(position, convertView, parent);
                MyItem item = getItem(position);
                ((TextView) view.findViewById(R.id.my_item_name)).setText(item.getName());
                // ... Fill in other views ...
                return view;
            }
        };
    
        dragSortListView.setAdapter(itemAdapter);
  6. ड्रॉप श्रोता सेट करें जो आइटम को गिराए जाने के बाद उसे फिर से व्यवस्थित करता है।

        dragSortListView.setDropListener(new DragSortListView.DropListener() {
            @Override public void drop(int from, int to) {
                MyItem movedItem = items.get(from);
                items.remove(from);
                if (from > to) --from;
                items.add(to, movedItem);
                itemAdapter.notifyDataSetChanged();
            }
        });

3

मैंने हाल ही में इस महान जीस्ट पर ठोकर खाई है जो ड्रैग सॉर्ट का एक कार्यशील कार्यान्वयन देता है ListView, जिसमें किसी बाहरी निर्भरता की आवश्यकता नहीं होती है।


मूल रूप से यह आपके कस्टम एडेप्टर को बनाने में शामिल होता है जो ArrayAdapterकि आपके गतिविधि वाले आंतरिक वर्ग के रूप में विस्तारित होता है ListView। इस एडेप्टर पर फिर onTouchListenerअपनी सूची आइटम पर एक सेट करें जो ड्रैग की शुरुआत का संकेत देगा।

उस गिस्ट में वे श्रोता को सूची आइटम (आइटम का "हैंडल") के विशिष्ट भाग में सेट करते हैं, इसलिए कोई गलती से उसके किसी हिस्से को दबाकर नहीं ले जाता है। व्यक्तिगत रूप से, मैंने onLongClickListenerइसके बजाय साथ जाना पसंद किया , लेकिन यह तय करना आपके ऊपर है। यहाँ उस हिस्से का एक अंश है:

public class MyArrayAdapter extends ArrayAdapter<String> {

    private ArrayList<String> mStrings = new ArrayList<String>();
    private LayoutInflater mInflater;
    private int mLayout;

    //constructor, clear, remove, add, insert...

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        View view = convertView;
        //inflate, etc...

        final String string = mStrings.get(position);
        holder.title.setText(string);

        // Here the listener is set specifically to the handle of the layout
        holder.handle.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    startDrag(string);
                    return true;
                }
                return false;
            }
        });

        // change color on dragging item and other things...         

        return view;
    }
}

इसमें एक onTouchListenerको जोड़ना भी शामिल है ListView, जो यह जांचता है कि क्या किसी आइटम को खींचा जा रहा है, स्वैपिंग और अमान्यकरण को हैंडल करता है, और ड्रैग स्टेट को रोकता है। उस हिस्से का एक अंश:

mListView.setOnTouchListener(new View.OnTouchListener() {
     @Override
     public boolean onTouch(View view, MotionEvent event) {
        if (!mSortable) { return false; }
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                break;
            }
            case MotionEvent.ACTION_MOVE: {
                // get positions
                int position = mListView.pointToPosition((int) event.getX(), 
                    (int) event.getY());
                if (position < 0) {
                    break;
                }
                // check if it's time to swap
                if (position != mPosition) {
                    mPosition = position;
                    mAdapter.remove(mDragString);
                    mAdapter.insert(mDragString, mPosition);
                }
                return true;
            }
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_OUTSIDE: {
                //stop drag state
                stopDrag();
                return true;
            }
        }
        return false;
    }
});

अंत में, यहां बताया गया है कि कैसे stopDragऔर startDragतरीके दिखते हैं, जो ड्रैग प्रक्रिया को सक्षम और अक्षम करते हैं:

public void startDrag(String string) {
    mPosition = -1;
    mSortable = true;
    mDragString = string;
    mAdapter.notifyDataSetChanged();
}

public void stopDrag() {
    mPosition = -1;
    mSortable = false;
    mDragString = null;
    mAdapter.notifyDataSetChanged();
}

हालांकि यह सबसे आसान कार्यान्वयन में से एक लगता है, यह बुरा लगता है (पंक्तियाँ बस स्विच करती हैं, वास्तव में शून्य दिखता है), यह बुरा लगता है और एक सूची के माध्यम से स्क्रॉल करता है जो स्क्रीन के नामुमकिन को फिट नहीं करता है (मैं लगातार पंक्तियों को बदले में स्विच करता हूं स्क्रॉल)।
हेंज़्लमेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.