আমি সম্প্রতি এই দুর্দান্ত গিস্টকে হোঁচট খেয়েছি যা 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();
}