Ich arbeite an Drag-and-Drop Listview Item für Tage und habe viel über suchen.Drag-and-Drop Listview Item mit "Custom Adapter" OnItemLongClickListener
Ich habe eine interessante Verbindung [DragNDropListView] [1] gefunden, aber leider zu "SimpleCursorAdapter"
angewendet werden könnteIch brauche aber eine Drag-and-Drop auf
- anzuwenden Listview-Artikel (nicht CardView noch RecycleView)
- auf kundenspezifischen Adapter erweitert von BaseAdapter
- OnItemLongClickListener
Hier My Custom Adapter:
public class BookingsListAdapter extends BaseAdapter implements DragNDropAdapter {
//Fragments
private static final int HOME_FRAGEMENT = 1;
private static final int MANAGE_BOOKINGS_FRAGMENT = 2;
//
private Context context;
private View rootView;
private Bundle bundle;
private LayoutInflater layoutInflater;
//Bookings
private ArrayList<PNRModel> pnrModels;
//Fragments
private int srcFragment;
//Drag-and-Dop
private int positions[];
private int handler;
public BookingsListAdapter(Context context, View rootView, Bundle bundle, int srcFragment, ArrayList<PNRModel> pnrModels, int handler) {
super();
this.context = context;
this.rootView = rootView;
this.bundle = bundle;
this.pnrModels = pnrModels;
setup(pnrModels.size());
this.srcFragment = srcFragment;
this.handler = handler;
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
private void setup(int size) {
positions = new int[size];
for (int i = 0; i < size; ++i)
positions[i] = i;
}
//Remove PNR Item
public boolean remove(int position) {
boolean isRemoved = false;
PNRsTable pnrsTable = new PNRsTable(context, DatabaseInfo.DATABASE_NAME, null, DatabaseInfo.DATABASE_VERSION);
switch (srcFragment) {
case HOME_FRAGEMENT:
//Update" MyBookings" PNRsTable field with "N"
isRemoved = pnrsTable.updateMyBooking(pnrModels.get(position).getBookingReference(), "N");
break;
case MANAGE_BOOKINGS_FRAGMENT:
//Delete PNR info from the DB PNRsTable
isRemoved = pnrsTable.deletePNR(pnrModels.get(position).getBookingReference());
//Delete PNR details from the File
FileHelper.deleteFile(context, pnrModels.get(position).getBookingReference());
break;
default:
break;
}
//Remove PNR from the Listview
pnrModels.remove(position);
notifyDataSetChanged();
return isRemoved;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return super.getDropDownView(positions[position], convertView, parent);
}
@Override
public int getCount() {
return pnrModels.size();
}
@Override
public Object getItem(int position) {
return pnrModels.get(positions[position]);
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(positions[position]);
}
@Override
public long getItemId(int position) {
return positions[position];
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final BookingViewHolder bookingViewHolder;
final PNRModel listItem = (PNRModel) getItem(position);
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.item_my_booking, null);
bookingViewHolder = new BookingViewHolder(context, rootView , bundle,
srcFragment, convertView);
convertView.setTag(bookingViewHolder);
} else {
bookingViewHolder = (BookingViewHolder) convertView.getTag();
}
//Set Listview Item Contents
bookingViewHolder.setItemContents(listItem);
//On Refresh click
bookingViewHolder.imgbtnRefresh.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bookingViewHolder.setOnButtonClick(listItem, position);
}
});
return convertView;
}
@Override
public boolean isEnabled(int position) {
return super.isEnabled(positions[position]);
}
@Override
public int getDragHandler() {
return handler;
}
@Override
public void onItemDrag(DragNDropListView parent, View view, int position, long id) {
}
@Override
public void onItemDrop(DragNDropListView parent, View view, int startPosition, int endPosition, long id) {
int position = positions[startPosition];
if (startPosition < endPosition)
for (int i = startPosition; i < endPosition; ++i)
positions[i] = positions[i + 1];
else if (endPosition < startPosition)
for (int i = startPosition; i > endPosition; --i)
positions[i] = positions[i - 1];
positions[endPosition] = position;
}
@Override
public void notifyDataSetChanged() {
setup(pnrModels.size());
super.notifyDataSetChanged();
}
}
und meine Aktivität:
DragNDropListView lstvBookings = (DragNDropListView) rootView.findViewById(R.id.lstvBookings);
//Display PNRs List in the ListView
BookingsListAdapter bookingsListAdapter = new BookingsListAdapter(context, rootView, bundle, srcFragment, pnrModels, R.id.rltvManageBookings);
lstvBookings.setDragNDropAdapter(bookingsListAdapter);
lstvBookings.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
BookingViewHolder bookingViewHolder = (BookingViewHolder) view.getTag();
view.startDrag(null, new View.DragShadowBuilder(view),view,0);
view.setVisibility(View.INVISIBLE);
return true;
}
});
habe ich versucht, dass und hat nicht funktioniert. Ich muss die Konstruktorparameter übergeben, wie im Code gezeigt, was nicht akzeptabel ist, wenn der Adapter aus dem SimpleAdapter erweitert wird. – Ghadeer
Bitte überprüfen Sie die geänderte Antwort zum benutzerdefinierten Adapter – anhtuannd
Funktioniert immer noch nicht. Ich habe den Code von Mein benutzerdefinierter Adapter nach dem Implementieren des DragNDropAdapter und der Aktivität, in der sich meine Listview befindet, hinzugefügt. Könnten Sie das bitte überprüfen? – Ghadeer