可拖拽的ListView

该博客介绍了如何在Android中实现长按拖拽ListView的item以改变排序。默认长按时间为500毫秒。由于WindowManager在添加视图时可能未完成测量,因此在获取宽高时可能为0。为解决此问题,可以通过添加全局布局监听器来在布局完成后获取正确的宽高。源代码可在GitHub项目draglistview中查看。
摘要由CSDN通过智能技术生成

长按拖拽item并实现变更排序;
安卓默认长按时间间隔500ms。
在这里插入图片描述

说明: WindowManager在addView时尚未测量完成, 获取宽高都是0。 可以这样测量:

 view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
int width = view.getMeasuredWidth();

使用getViewTreeObserver().addOnGlobalLayoutListener是布局完成后可以获取宽高;

public class DragListView extends ListView {

  private WindowManager.LayoutParams windowParams;
  private WindowManager windowManager;
  private ImageView dragImageView;

  private int offsetScreenTop; //距离屏幕顶部的位置
  private int offsetViewTop;  //手指按下位置距离item顶部的位置
  private int dragPosition;

  //上次点击按下的坐标
  private int mLastMotionX, mLastMotionY;

  private final int TOUCH_SLOP = 20;
  private Runnable mLongPressRunnable;
  private Bitmap mCurItemBmp;

  //当前是否长按状态
  private boolean mIsLongTouch;

  public DragListView(Context context) {
    super(context);
  }

  public DragListView(Context context, AttributeSet attrs) {
    super(context, attrs);

    mLongPressRunnable = new Runnable() {
      @Override public void run() {
        mIsLongTouch = true;

        startDrag(mCurItemBmp, mLastMotionY);
      }
    };
  }

  //itemview里有view处理点击事件时, 当前ListView无法收到UP或CANCEL消息
  @Override public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值