0
ドラッグアンドドロップリストビュー項目を数日間操作していて、検索がたくさんあります。"カスタムアダプター"を持つドラッグアンドドロップリストビュー項目OnItemLongClickListener
私は興味深いリンク[DragNDropListView] [1]が、残念ながら「SimpleCursorAdapter」にも適用することができるしかし、私は
- にドラッグアンドドロップを適用する必要を発見した
カスタムアダプタのListView項目(未CardViewもRecycleView)
- がBaseAdapter から
- OnItemLongClickListener
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();
}
}そして、私のアクティビティー:
は、ここで私のカスタムアダプタです
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;
}
});
私はそれを試してみましたが、うまくいきませんでした。コードに示されているコンストラクタパラメータを渡す必要があります。これは、SimpleAdapterからアダプタを継承するときに受け入れられません。 – Ghadeer
カスタムアダプター – anhtuannd
についての修正された回答を確認してください。まだ動作しません。私はDragNDropAdapterと私のリストビューがあるアクティビティを実装した後、私のカスタムアダプタのコードを追加しました。それを確認していただけますか? – Ghadeer