0
我正在使用拖放式Listview项目进行日期搜索,并进行了大量搜索。使用“自定义适配器”拖放Listview项目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扩展Adapter时,这是不可接受的。 – Ghadeer
请检查有关自定义适配器的修改答案 – anhtuannd
仍然无效。在实现DragNDropAdapter和我的Listview所在的Activity后,我添加了自定义适配器的代码。你能检查一下吗? – Ghadeer