Kısa bir süre önce , harici bağımlılıklara ihtiyaç duymadan, sürükle sıralamanın çalışan bir uygulamasını sağlayan bu harika Öz'e rastladım ListView.
Temel olarak, özel Adaptörünüzü oluşturarak, ArrayAdapterbir iç sınıf olarak sizin ListView. Bu adaptörde onTouchListener, sürüklemenin başlangıcını işaret edecek olan Liste Öğelerinize bir tane ayarlar .
Bu Temelde, dinleyiciyi Liste Öğesinin düzeninin belirli bir kısmına (öğenin "tutacağı") ayarlarlar, böylece kişi yanlışlıkla herhangi bir kısmına basarak onu hareket ettirmez. Şahsen ben onLongClickListenerbunun yerine bir ile gitmeyi tercih ettim , ama buna karar vermek size kalmış. İşte o bölümden bir alıntı:
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;
}
}
Bu aynı zamanda bir ekleme içerir onTouchListeneriçin ListViewbir öğe sürüklenen ise hangi kontroller, kolları takası ve geçersiz kılma ve sürükleme durumunu durdurur. Bu bölümden bir alıntı:
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;
}
});
Son olarak, burada ne kadar stopDragve startDragetkinleştirme ve sürükleme işleminin devre dışı bırakılması işlemek, hangi gibi yöntemler bak:
public void startDrag(String string) {
mPosition = -1;
mSortable = true;
mDragString = string;
mAdapter.notifyDataSetChanged();
}
public void stopDrag() {
mPosition = -1;
mSortable = false;
mDragString = null;
mAdapter.notifyDataSetChanged();
}