android listview qq,Android仿QQ、微信ListView滑动删除item

最近做项目需要用到ListView滑动出现一个删除按钮来删除item,由于自己以前没做过,只能现学现卖,呵呵。百度一下资料还真不少,首先看到的是github上的开源项目S

最近做项目需要用到ListView滑动出现一个删除按钮来删除item,由于自己以前没做过,只能现学现卖,呵呵。百度一下资料还真不少,首先看到的是github上的开源项目SwipeListView库地址:https://github.com/47deg/android-swipelistview,项目和库一般不在一个地方,Example地址:https://github.com/47deg/android-swipelistview-sample,依赖于https://github.com/JakeWharton/NineOldAndroids 如图:

7e6bc5635163807b349451860f0d4034.png

它的效果是按钮隐藏在item下面不会动,像一个女人在床上一动不动感觉不太好。而我现在想要的效果是删除按钮在item后面能够随之而动,类似QQ一样,因为这样自己感觉会更好一点。在网上也找到了一些资料但是不够完美,,自己有加以修改,效果挺理想,和qq一样,用在项目中也没丝毫问题,哦也!效果如图:

674a64a5f80b87043b36c3df171347de.gif

下面是代码的一些详细内容

自定义ListView:

package com.ryg.slideview;

import android.content.Context;

import android.util.AttributeSet;

import android.util.Log;

import android.view.MotionEvent;

import android.view.View;

import android.widget.ListView;

public class CustomSwipeListView extends ListView {

private static final String TAG = "ListViewCompat";

public static SwipeItemView mFocusedItemView;

public CustomSwipeListView(Context context) {

super(context);

}

public CustomSwipeListView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public CustomSwipeListView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

}

public void shrinkListItem(int position) {

View item = getChildAt(position);

if (item != null) {

try {

((SwipeItemView) item).shrink();

} catch (ClassCastException e) {

e.printStackTrace();

}

}

}

@Override

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN: {

int x = (int) event.getX();

int y = (int) event.getY();

// 我们想知道当前点击了哪一行

int position = pointToPosition(x, y);

Log.e(TAG, "postion=" + position);

if (position != INVALID_POSITION) {

// 由于pointToPosition返回的是ListView所有item中被点击的item的position,

// 而listview只会缓存可见的item,因此getChildAt()的时候,需要通过减去getFirstVisiblePosition()

// 来计算被点击的item在可见items中的位置。

int firstPos = getFirstVisiblePosition();

mFocusedItemView = (SwipeItemView) getChildAt(position

- firstPos);

Log.d("gaolei", "position------------------" + position);

Log.d("gaolei", "firstPos------------------" + firstPos);

Log.d("gaolei", "mFocusedItemView-----isNull---------"

+ (mFocusedItemView != null));

}

}

default:

break;

}

if (mFocusedItemView != null) {

mFocusedItemView.onRequireTouchEvent(event);

}

return super.onTouchEvent(event);

}

}

自定义item的布局:

package com.ryg.slideview;

import android.content.Context;

import android.util.AttributeSet;

import android.util.Log;

import android.view.MotionEvent;

import android.view.View;

import android.widget.LinearLayout;

import android.widget.RelativeLayout;

import android.widget.Scroller;

import android.widget.TextView;

public class SwipeItemView extends LinearLayout {

private static final String TAG = "SlideView";

private Context mContext;

private LinearLayout mViewContent;

private RelativeLayout mHolder;

private Scroller mScroller;

private OnSlideListener mOnSlideListener;

private int mHolderWidth;

private int mLastX = 0;

private int mLastY = 0;

private static final int TAN = 2;

public interface OnSlideListener {

public static final int SLIDE_STATUS_OFF = 0;

public static final int SLIDE_STATUS_START_SCROLL = 1;

public static final int SLIDE_STATUS_ON = 2;

/**

* @param view

*

current SlideView

* @param status

*

SLIDE_STATUS_ON or SLIDE_STATUS_OFF

*/

public void onSlide(View view, int status);

}

public SwipeItemView(Context context) {

super(context);

initView();

}

public SwipeItemView(Context context, AttributeSet attrs) {

super(context, attrs);

initView();

}

private void initView() {

mContext = getContext();

// 初始化弹性滑动对象

mScroller = new Scroller(mContext);

// 设置其方向为横向

setOrientation(LinearLayout.HORIZONTAL);

// 将slide_view_merge加载进来

View.inflate(mContext, R.layout.slide_view_merge, this);

mViewContent = (LinearLayout) findViewById(R.id.view_content);

mHolder = (RelativeLayout) findViewById(R.id.holder);

mHolder.measure(View.MeasureSpec.UNSPECIFIED,

View.MeasureSpec.UNSPECIFIED);

mHolderWidth = mHolder.getMeasuredWidth();

mHolder.setLayoutParams(new LinearLayout.LayoutParams(mHolderWidth,

LayoutParams.MATCH_PARENT));

}

public void setButtonText(CharSequence text) {

((TextView) findViewById(R.id.delete)).setText(text);

}

public void setContentView(View view) {

mViewContent.addView(view);

}

public void setOnSlideListener(OnSlideListener onSlideListener) {

mOnSlideListener = onSlideListener;

}

public void shrink() {

if (getScrollX() != 0) {

this.smoothScrollTo(0, 0);

}

}

public void onRequireTouchEvent(MotionEvent event) {

int x = (int) event.getX();

int y = (int) event.getY();

int scrollX = getScrollX();

Log.d(TAG, "x=" + x + " y=" + y);

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN: {

if (!mScroller.isFinished()) {

mScroller.abortAnimation();

}

if (mOnSlideListener != null) {

mOnSlideListener.onSlide(this,

OnSlideListener.SLIDE_STATUS_START_SCROLL);

}

break;

}

case MotionEvent.ACTION_MOVE: {

int deltaX = x - mLastX;

int deltaY = y - mLastY;

if (Math.abs(deltaX) < Math.abs(deltaY) * TAN) {

break;

}

int newScrollX = scrollX - deltaX;

if (deltaX != 0) {

if (newScrollX < 0) {

newScrollX = 0;

} else if (newScrollX > mHolderWidth) {

newScrollX = mHolderWidth;

}

this.scrollTo(newScrollX, 0);

}

break;

}

case MotionEvent.ACTION_UP: {

int newScrollX = 0;

if (scrollX - mHolderWidth * 0.75 > 0) {

newScrollX = mHolderWidth;

}

this.smoothScrollTo(newScrollX, 0);

if (mOnSlideListener != null) {

mOnSlideListener.onSlide(this,

newScrollX == 0 ? OnSlideListener.SLIDE_STATUS_OFF

: OnSlideListener.SLIDE_STATUS_ON);

}

break;

}

default:

break;

}

mLastX = x;

mLastY = y;

}

private void smoothScrollTo(int destX, int destY) {

int scrollX = getScrollX();

int delta = destX - scrollX;

mScroller.startScroll(scrollX, 0, delta, 0, Math.abs(delta) * 3);

invalidate();

}

@Override

public void computeScroll() {

if (mScroller.computeScrollOffset()) {

scrollTo(mScroller.getCurrX(), mScroller.getCurrY());

postInvalidate();

}

}

}

下面是项目源码,欢迎光临......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值