自定义的GridView,里面多写了,长按事件和拖动事件
public class DragGrid extends GridView {
private int dragPosition;
private int dropPosition;
private ImageView dragImageView;
private WindowManager windowManager;
private WindowManager.LayoutParams windowParams;
private int itemHeight, itemWidth;
public DragGrid(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DragGrid(Context context) {
super(context);
}
boolean flag = false;
public void setLongFlag(boolean temp) {
flag = temp;
}
public boolean setOnItemLongClickListener(final MotionEvent ev) {
this.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
int x = (int) ev.getX();
int y = (int) ev.getY();
dragPosition = dropPosition = arg2;
System.out.println(dragPosition + "--" + arg2);
if (dragPosition == AdapterView.INVALID_POSITION) {
}
ViewGroup itemView = (ViewGroup) getChildAt(dragPosition
- getFirstVisiblePosition());
itemHeight = itemView.getHeight();
itemWidth = itemView.getWidth();
itemView.destroyDrawingCache();
itemView.setDrawingCacheEnabled(true);
Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache());
startDrag(bm, x, y);
return false;
};
});
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
return setOnItemLongClickListener(ev);
}
return super.onInterceptTouchEvent(ev);
}
private void startDrag(Bitmap bm, int x, int y) {
stopDrag();
windowParams = new WindowManager.LayoutParams();
windowParams.gravity = Gravity.TOP | Gravity.LEFT;
windowParams.x = x - itemWidth / 2;
windowParams.y = y - itemHeight / 2;
windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
ImageView iv = new ImageView(getContext());
iv.setImageBitmap(bm);
windowManager = (WindowManager) getContext().getSystemService(
Context.WINDOW_SERVICE);// "window"
windowManager.addView(iv, windowParams);
dragImageView = iv;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (dragImageView != null
&& dragPosition != AdapterView.INVALID_POSITION) {
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
onDrag(x, y);
break;
case MotionEvent.ACTION_UP:
stopDrag();
onDrop(x, y);
break;
}
}
return super.onTouchEvent(ev);
}
private void onDrag(int x, int y) {
if (dragImageView != null) {
windowParams.alpha = 0.6f;
windowParams.x = x - itemWidth / 2;
windowParams.y = y - itemHeight / 2;
windowManager.updateViewLayout(dragImageView, windowParams);
}
}
private void onDrop(int x, int y) {
int tempPosition = pointToPosition(x, y);
if (tempPosition != AdapterView.INVALID_POSITION) {
dropPosition = tempPosition;
}
if (dropPosition != dragPosition) {
System.out.println("dragPosition: " + dragPosition
+ " dropPosition: " + dropPosition);
DateAdapter adapter = (DateAdapter) this.getAdapter();
adapter.exchange(dragPosition, dropPosition);
}
}
private void stopDrag() {
if (dragImageView != null) {
windowManager.removeView(dragImageView);
dragImageView = null;
}
}
}
在 Main中调用
gridView = (DragGrid) findViewById(R.id.gridview);
ArrayList<String> l = new ArrayList<String>();
for (int i = 0; i < 8; i++) {
l.add("" + i);
}
gridView.setAdapter(new DateAdapter(MiLaucherActivity.this, l));
adapter
public class DateAdapter extends BaseAdapter {
private Context context;
private List<String> lstDate;
private TextView txtAge;
public DateAdapter(Context mContext, List<String> list) {
this.context = mContext;
lstDate = list;
}
@Override
public int getCount() {
return lstDate.size();
}
@Override
public Object getItem(int position) {
return lstDate.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public void exchange(int startPosition, int endPosition) {
System.out.println(startPosition + "--" + endPosition);
Object endObject = getItem(endPosition);
Object startObject = getItem(startPosition);
System.out.println(startPosition + "========" + endPosition);
lstDate.add(startPosition, (String) endObject);
lstDate.remove(startPosition + 1);
lstDate.add(endPosition, (String) startObject);
lstDate.remove(endPosition + 1);
notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(context).inflate(R.layout.item, null);
txtAge = (TextView) convertView.findViewById(R.id.txt_userAge);
txtAge.setText("Item" + lstDate.get(position));
return convertView;
}
}
mainLayout.xml
<com.ljp.laucher.util.DragGrid
android:id="@+id/gridview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dip"
android:numColumns="2"
android:horizontalSpacing="8dp" android:verticalSpacing="8dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/g_one"
android:layout_width="200dp"
android:layout_height="100dp"
android:background="#5565e28e"
android:orientation="vertical" >
<ImageView android:layout_width="200dp"
android:layout_height="100dp" android:src="@null"/>
<TextView
android:id="@+id/txt_userAge"
android:layout_width="200dp"
android:layout_height="100dp"
android:text="Item" android:gravity="center"
android:textColor="#ffffff"
android:textSize="18sp" >
</TextView>
</RelativeLayout>