Saya baru-baru ini menemukan inti besar ini yang memberikan implementasi yang baik dari jenis drag ListView
, tanpa ketergantungan eksternal diperlukan.
Pada dasarnya ini terdiri dari menciptakan Adaptor kustom Anda yang diperluas ArrayAdapter
sebagai kelas dalam untuk aktivitas yang berisi Anda ListView
. Pada adaptor ini, satu set onTouchListener
ke Item Daftar Anda yang akan menandakan awal dari hambatan.
Dalam Gist itu mereka mengatur pendengar ke bagian tertentu dari tata letak Item Daftar ("pegangan" item), jadi orang tidak sengaja memindahkannya dengan menekan bagian mana pun darinya. Secara pribadi, saya lebih memilih untuk pergi dengan onLongClickListener
gantinya, tetapi itu terserah Anda untuk memutuskan. Berikut kutipan dari bagian itu:
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;
}
}
Ini juga melibatkan penambahan onTouchListener
ke ListView
, yang memeriksa apakah suatu item diseret, menangani pertukaran dan pembatalan, dan menghentikan status seret. Kutipan dari bagian itu:
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;
}
});
Akhirnya, berikut adalah bagaimana stopDrag
dan startDrag
metode yang terlihat, yang menangani mengaktifkan dan menonaktifkan proses seret:
public void startDrag(String string) {
mPosition = -1;
mSortable = true;
mDragString = string;
mAdapter.notifyDataSetChanged();
}
public void stopDrag() {
mPosition = -1;
mSortable = false;
mDragString = null;
mAdapter.notifyDataSetChanged();
}