অ্যান্ড্রয়েড তালিকা দেখুন দেখুন টেনে আনুন এবং ড্রপ করুন


132

আমার কাছে একটি লিস্টভিউতে রেকর্ডগুলির একটি তালিকা রয়েছে যা আমি চাই যে ব্যবহারকারী একটি ড্রাগ এবং ড্রপ পদ্ধতি ব্যবহার করে পুনরায় বাছাই করতে সক্ষম হোক। আমি এটি অন্যান্য অ্যাপ্লিকেশনগুলিতে প্রয়োগ করা দেখেছি, তবে এর কোনও টিউটোরিয়াল আমি পাইনি। এটি অবশ্যই এমন কিছু হতে হবে যা অন্যদেরও প্রয়োজন। কেউ কি আমাকে এই কোডটি করার জন্য কিছু কোডে নির্দেশ করতে পারে?


1
আমি এই টিউটোরিয়ালটি পেয়েছি যা একটি বাছাইযোগ্য তালিকার ভিউ তৈরিতে সহায়তা করে । আমি এটি এখনও পরীক্ষা করি নি তবে ভিডিওটি আশাব্যঞ্জক মনে হচ্ছে
অ্যালেক্স

@ আরকদে কোন মজা নেই, বহু বছর পরেও তারা এখনও এই প্রশ্নের উত্তর মেনে নেয়নি।
আর্টঅফ ওয়ারফেয়ার

@ আর্টঅফ ওয়ারফেয়ার আমার ধারণা একজনের উচিত বিবেচনা করা উচিত যে প্রশ্নকারীকে দুর্ভাগ্যজনক কিছু ঘটতে পারে ... আরও ক্রিয়াকলাপটিকে অস্বীকার করে।
হাইকোস্মো

1
@ হাইকোসমো এটি সম্ভব ... তাদের এসও প্রোফাইল অনুসারে, মিয়ানেল প্রশ্নটি জিজ্ঞাসার ঠিক এক মাস পরে সর্বশেষে এসেছিল। এছাড়াও, ডিএসএলভিতে দুর্দান্ত কাজ ... আমি ডাবল ট্যাপের মতো জিনিসগুলিকে আইটেমের সদৃশ করতে এবং আইটেমটির ছায়াটিকে প্রায় টেনে এনে পরিবর্তন করার অনুমতি দেওয়ার জন্য এতে কয়েকটি পরিবর্তন করেছি (আমার আইটেমগুলির প্রত্যেকটিতে তাদের সারি নম্বর রয়েছে, তাই আমি এটি তৈরি করা হয়েছে যাতে এটি টেনে আনার সাথে সাথে সারি নম্বর আপডেটগুলি আপডেট করতে পারে)) তারা ধরণের হ্যাক করেছে, ক্লাসের সমস্ত কিছুর চেয়ে অনেক কম মার্জিত, সুতরাং কেন আমি গিটহাবে পরিবর্তন জমা দিই নি।
আর্টঅফ ওয়ারফেয়ার

github.com/bauerca/drag-sort-listview আমি এটি ব্যবহার করছি এবং লং ক্লিকের তালিকার ভিউতে কোনও ROW টানা সম্ভব?
আচিন

উত্তর:


85

আমি কিছুদিন ধরে এটি নিয়ে কাজ করছি। সঠিকভাবে পাওয়া শক্ত, এবং আমি দাবি করি না যে আমি এটি করি, তবে আমি এ পর্যন্ত খুশি। আমার কোড এবং বেশ কয়েকটি ডেমো পাওয়া যাবে

যদিও এর ব্যবহারের, খুব TouchInterceptor (যা কোডটি ভিত্তি করে) অনুরূপ গুরুত্বপূর্ণ বাস্তবায়ন পরিবর্তন করা হয়েছে।

আইটেমগুলি টেনে এনে এবং বদল করার সময় ড্রাগসআর্টলিস্টভিউতে মসৃণ এবং অনুমানযোগ্য স্ক্রোলিং থাকে। আইটেমের শাফলগুলি টেনে আনার / ভাসমান আইটেমের অবস্থানের সাথে অনেক বেশি সামঞ্জস্যপূর্ণ। ভিন্নজাতীয়-উচ্চতার তালিকা আইটেমগুলি সমর্থিত। টানুন-স্ক্রোলিংটি কাস্টমাইজযোগ্য (আমি দীর্ঘ তালিকার মাধ্যমে দ্রুত ড্র্যাগ স্ক্রোলিংটি প্রদর্শন করি --- এটি প্রয়োগটি মনে আসে না)। শিরোলেখ / পাদদেশ সম্মানিত হয় ইত্যাদি। ?? দেখা যাক.


3
আপনার সমাধান একটি কবজ মত কাজ করে। অন্যদের চেয়ে অনেক বেশি ভাল। আপনার উত্স কোড লাইসেন্স কি? আপাচে ২.০?
দারিউজ ব্যাকিনস্কি

1
ডেমোতে প্রদত্ত ভিউগুলি ব্যবহার করে আমার অ্যাপটিতে একটি বিন্যাস তৈরি করার সময় @ হাইসোস্মোতে আমার কয়েকটি সমস্যা রয়েছে। বেশ কয়েকটি নেমস্পেস ত্রুটি, আপনি কীভাবে আপনার প্রদত্ত কোডটি ব্যবহার করবেন সে সম্পর্কে একটি ছোট ব্লগপোস্ট দয়া করে করতে পারেন?
daniel_c05

কোডটি এমনভাবে সংশোধন করার কোনও সম্ভাবনা আছে যে আপনি যখন আইটেমগুলি উপরের দিকে টানছেন তখন আইটেমগুলি কেবল ড্রপ করে সাজানো হয় না?
অ্যালেক্স Semeniuk

@ হাইকোসমো আপনি কি নিজের গিটহাবের সংগ্রহস্থলকে অ্যাক্সেসযোগ্য করতে পারবেন? এটি অফলাইন বলে মনে হচ্ছে ...
এসডাসদাস

8
বাউরকা রেপো আর রক্ষণাবেক্ষণ করা হয় না। এই কাঁটাচামচ আরও সক্রিয়: github.com/JHH5/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;
}

এটিতে খুব সুন্দর টিউটোরিয়ালটি মিডিয়াম ডট কম এ পাওয়া যাবে: রিসাইক্লারভিউয়ের সাথে টেনে আনুন এবং সোয়াইপ করুন


18

যারা এই সম্পর্কে গুগল করেন তাদের উদ্দেশ্যে এই উত্তরটি যুক্ত করছি ..

ডেভাইটস এর একটি পর্ব ছিল (তালিকার ভিউ সেল ড্র্যাগিং এবং রিয়ারেনজিং)সম্প্রতি ) যা এটি কীভাবে করবেন তা ব্যাখ্যা করে

আপনি এটি সন্ধান করতে পারেন এখানে নমুনা কোডও পাওয়া যায়

এই কোডটি মূলত যা করে তা হ'ল এটি সেল বর্ধক এবং অদলবদল সমর্থন করে এমন একটি dynamic listviewসম্প্রসারণ দ্বারা একটি তৈরি করে listview। যাতে আপনি DynamicListViewআপনার বেসিকের পরিবর্তে ব্যবহার করতে পারেন ListView এবং এটিই আপনি ড্রাগ এবং ড্রপ সহ একটি তালিকাভিউ প্রয়োগ করেছেন।


1
ডিভাইবাইট বাস্তবায়ন ব্যবহার করার সময় মনে রাখবেন যে আপনার অ্যাডাপ্টার এবং ডায়নামিকলিস্টভিউ মশ একই জিনিস ভাগ করে যদি বস্তুগুলি অ্যারে হয়। অন্যথায় বাস্তবায়ন কার্যকর হবে না। এটি স্ট্যাটিক তালিকার জন্য সমস্যা নয় তবে লোডারদের কাছে এটি একটি চ্যালেঞ্জ হতে পারে
অ্যাভারিন

আমি বর্তমান 5.0 অ্যান্ড্রয়েড সংস্করণে উদাহরণটি চেষ্টা করেছি।
এটিতে

@ টিটিএ হ্যাঁ, আমি 5.0.0 এও সমস্যা পেয়েছি। সাহায্য করুন.
মনু

6

ড্র্যাগলিস্টভিউ লাইব কাস্টম অ্যানিমেশন যেমন এলিভেশন অ্যানিমেশনগুলির জন্য খুব সুন্দর সমর্থন সহ সত্যিই ঝরঝরে করে। এটি এখনও নিয়মিত ভিত্তিতে রক্ষণাবেক্ষণ এবং আপডেট করা হয়।

আপনি এটি কীভাবে ব্যবহার করবেন তা এখানে:

1: প্রথমে গ্রেড গ্রেট যুক্ত করুন

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

2: এক্সএমএল থেকে তালিকা যুক্ত করুন

<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: ড্র্যাগআইটেমএডাপ্টার থেকে ওভাররাইড হওয়া একটি অ্যাডাপ্টার তৈরি করুন

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: ড্রাগ ভিটামার অ্যাডাপ্টার.ভিউহোল্ডার থেকে প্রসারিত এমন কোনও ভিউহোল্ডার প্রয়োগ করুন

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/ ড্র্যাগলিস্টভিউতে যান


5

আমি পেয়েছি ড্র্যাগসোর্টলিস্টভিউ ভাল কাজ করেছে, যদিও এটির কাজ শুরু করা আরও সহজ হতে পারে। মেমরির তালিকা সহ অ্যান্ড্রয়েড স্টুডিওতে এটি ব্যবহারের জন্য একটি সংক্ষিপ্ত টিউটোরিয়াল এখানে দেওয়া হয়েছে:

  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. একটি ড্র্যাগসোর্টলিস্টভিউ লেআউট তৈরি করুন, এরকম কিছু:

    <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();
}

যদিও এটি সবচেয়ে সহজ বাস্তবায়নগুলির মধ্যে একটি বলে মনে হচ্ছে, এটি দেখতে খারাপ দেখাচ্ছে (সারিগুলি কেবল স্যুইচ করে, সেখানে আসলে শূন্য চেহারা রয়েছে), এটি খারাপ লাগে এবং এমন একটি তালিকা দিয়ে স্ক্রোলিং করে যা স্ক্রিনের নিকটে অসম্ভব ফিট করে না (আমি ক্রমাগত পরিবর্তে সারিগুলি স্যুইচ করি switch স্ক্রলিং)।
হেইনজলমেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.