自定义Listview,向左滑动,右边刚好显示删除按钮:
public class SlideListView extends ListView {
    private int mScreenWidth; // 屏幕宽度
    private int mDownX; // 按下点的x值
    private int mDownY; // 按下点的y值
    private int mDeleteBtnWidth;// 删除按钮的宽度
    private boolean isDeleteShown; // 删除按钮是否正在显示
    private ViewGroup mPointChild; // 当前处理的item
    private LinearLayout.LayoutParams mLayoutParams; // 当前处理的item的LayoutParams
    public SlideListView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public SlideListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        // 获取屏幕宽度
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        mScreenWidth = dm.widthPixels;
    }
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                performActionDown(ev);
                break;
            case MotionEvent.ACTION_MOVE:
                return performActionMove(ev);
            case MotionEvent.ACTION_UP:
                performActionUp();
                break;
        }
        return super.onTouchEvent(ev);
    }
    // 处理action_down事件
    private void performActionDown(MotionEvent ev) {
        if (isDeleteShown) {
            turnToNormal();
        }
        mDownX = (int) ev.getX();
        mDownY = (int) ev.getY();
        // 获取当前点的item
        mPointChild = (ViewGroup) getChildAt(pointToPosition(mDownX, mDownY)
                - getFirstVisiblePosition());
        // 获取删除按钮的宽度
        mDeleteBtnWidth = mPointChild.getChildAt(1).getLayoutParams().width;
        mLayoutParams = (LinearLayout.LayoutParams) mPointChild.getChildAt(0)
                .getLayoutParams();
        mLayoutParams.width = mScreenWidth;
        mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
    }
    // 处理action_move事件
    private boolean performActionMove(MotionEvent ev) {
        int nowX = (int) ev.getX();
        int nowY = (int) ev.getY();
        if (Math.abs(nowX - mDownX) > Math.abs(nowY - mDownY)) {
            // 如果向左滑动
            if (nowX < mDownX) {
                // 计算要偏移的距离
                int scroll = (nowX - mDownX) / 2;
                // 如果大于了删除按钮的宽度, 则最大为删除按钮的宽度
                if (-scroll >= mDeleteBtnWidth) {
                    scroll = -mDeleteBtnWidth;
                }
                // 重新设置leftMargin
                mLayoutParams.leftMargin = scroll;
//                mLayoutParams.leftMargin = scroll*2;
                mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
            }
//            return true;
        }
        return super.onTouchEvent(ev);
    }
    // 处理action_up事件
    private void performActionUp() {
        // 偏移量大于button的一半,则显示button
        // 否则恢复默认
        if (-mLayoutParams.leftMargin >= mDeleteBtnWidth / 2) {
            mLayoutParams.leftMargin = -mDeleteBtnWidth;
//            mLayoutParams.leftMargin = -mDeleteBtnWidth * 2;
            isDeleteShown = true;
        } else {
            turnToNormal();
        }
        mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
    }
    /**
     * 变为正常状态
     */
    public void turnToNormal() {
        mLayoutParams.leftMargin = 0;
        mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
        isDeleteShown = false;
    }
    /**
     * 当前是否可点击
     *
     * @return 是否可点击
     */
    public boolean canClick() {
        return !isDeleteShown;
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//与scrollview嵌套需要重新计算高度
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }
}
适配器:
public class ListViewSlideAdapter extends BaseAdapter {
    private ArrayList<String> bulbList;
    private Activity context;
    private OnClickListenerEditOrDelete onClickListenerEditOrDelete;
    public ListViewSlideAdapter(Activity context, ArrayList<String> bulbList) {
this.bulbList = bulbList;
this.context = context;
}
public void setmNews(ArrayList<String> mNews) {
this.bulbList = mNews;
}
@Override
public int getCount() {
return bulbList.size();
}
@Override
public Object getItem(int position) {
return bulbList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final String str = bulbList.get(position);
ViewHolder viewHolder;
if (null == convertView) {
convertView = context.getLayoutInflater().inflate(R.layout.lay_list_collection_item, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);//store up viewHolder
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.tvDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onClickListenerEditOrDelete != null) {
onClickListenerEditOrDelete.OnClickListenerDelete(position);
}
}
});
if (!TextUtils.isEmpty(str.)) {
viewHolder.mTv.setText("" + str);
}
return convertView;
}
public void setOnClickListenerEditOrDelete(OnClickListenerEditOrDelete onClickListenerEditOrDelete1) {
this.onClickListenerEditOrDelete = onClickListenerEditOrDelete1;
}
public interface OnClickListenerEditOrDelete {
void OnClickListenerDelete(int position);
}
private class ViewHolder {
TextView mTv;
TextView tvDelete;
ViewHolder(View view) {
mTv = (TextView) view.findViewById(R.id.tv_title);
tvDelete = (TextView) view.findViewById(R.id.tv_delete);
}
}
}
Item布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:maxLength="@integer/maxlength"
android:textColor="@color/black"
android:textSize="@dimen/text_16" />
<TextView
android:id="@+id/tv_delete"
android:layout_width="60dp"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/panding_5"
android:background="@color/color_26"
android:gravity="center"
android:text="删除"
android:textColor="@color/text_f7"
android:textSize="@dimen/text_16" />
</LinearLayout>
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:background="@color/color_f4"
android:orientation="vertical">
<View
android:layout_width="match_parent"
android:layout_height="@dimen/margin_1"
android:background="@color/color_line_ae" />
<...PullToRefreshScrollView
android:id="@+id/pull_refresh_scrollview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
app:ptrAnimationStyle="flip"
app:ptrMode="both">
<...SlideListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/panding_5"
android:layout_marginRight="@dimen/panding_5"
android:divider="@null"
android:dividerHeight="0dp" />
</...PullToRefreshScrollView>
<TextView
android:id="@+id/tv_notic"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_horizontal"
android:paddingTop="20dp"
android:text="暂无收藏"
android:visibility="gone" />
例子:
mListCollectionAdapter = new ListViewSlideAdapter(this, mMessageReceive);
mListView.setAdapter(mListCollectionAdapter);
mListView.setOnItemClickListener(this);
mListCollectionAdapter.setOnClickListenerEditOrDelete(new ListViewSlideAdapter.OnClickListenerEditOrDelete() {
@Override
public void OnClickListenerDelete(int position) {
//删除按钮点击事件
}
});
原文:http://www.cnblogs.com/shenchanghui/p/5788725.html