首页 > 学院 > 开发设计 > 正文

ListView左划删除

2019-11-09 18:44:29
字体:
来源:转载
供稿:网友

参考网上大神的例子,自己照着大意写了一遍(留着参考,方便日后使用)

1、新建MyListView 继承自ListView 重写方法

代码如下:

package com.deletetest;import android.content.Context;import android.util.AttributeSet;import android.util.DisplayMetrics;import android.view.MotionEvent;import android.view.ViewGroup;import android.view.WindowManager;import android.widget.LinearLayout;import android.widget.ListView;/** * Created by Administrator on 2016/12/9. */public class MyListView 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 MyListView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public MyListView(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();        // 为什么要重新设置layout_width 等于屏幕宽度        // 因为match_parent时,不管你怎么滑,都不会显示删除按钮        // why? 因为match_parent时,ViewGroup就不去布局剩下的view        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) / 3;                // 如果大于了删除按钮的宽度, 则最大为删除按钮的宽度                if(-scroll >= mDeleteBtnWidth) {                    scroll = -mDeleteBtnWidth;                }                // 重新设置leftMargin                mLayoutParams.leftMargin = scroll;                mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);            }            return true;        }        return super.onTouchEvent(ev);    }    // 处理action_up事件    private void performActionUp() {        // 偏移量大于button的一半,则显示button        // 否则恢复默认        if(-mLayoutParams.leftMargin >= mDeleteBtnWidth / 3) {            mLayoutParams.leftMargin = -mDeleteBtnWidth;            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;    }}

2、activity侧代码:

package com.deletetest;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.TextView;import android.widget.Toast;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {    private MyListView mListView;    private ArrayList<String> mData = new ArrayList<String>() {        {            for(int i=0;i<50;i++) {                add("十言" + i);            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mListView = (MyListView) findViewById(R.id.list);        mListView.setAdapter(new MyAdapter());        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view,                                    int position, long id) {                if(mListView.canClick()) {                    Toast.makeText(MainActivity.this, mData.get(position), Toast.LENGTH_SHORT).show();                }            }        });    }    class MyAdapter extends BaseAdapter {        @Override        public int getCount() {            return mData.size();        }        @Override        public Object getItem(int position) {            return mData.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            if(null == convertView) {                convertView = View.inflate(MainActivity.this, R.layout.item, null);            }            TextView tv = (TextView) convertView.findViewById(R.id.tv);            TextView delete = (TextView) convertView.findViewById(R.id.delete);            tv.setText(mData.get(position));            final int pos = position;            delete.setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    mData.remove(pos);                    notifyDataSetChanged();                    mListView.turnToNormal();                    Toast.makeText(MainActivity.this,"已删除",Toast.LENGTH_SHORT).show();                }            });            return convertView;        }    }}

3、activity侧布局

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"    android:layout_width="match_parent" android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.deletetest.MainActivity">    <com.loupai.deletetest.MyListView        android:id="@+id/list"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:cacheColorHint="@android:color/transparent"        android:listSelector="@android:color/transparent"        android:divider="@android:color/darker_gray"        android:dividerHeight="2dp"        android:scrollbars="none"/></RelativeLayout>

4、item布局如下

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="horizontal">    <TextView        android:id="@+id/tv"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:paddingBottom="20dp"        android:paddingLeft="10dp"        android:paddingTop="20dp"        android:background="@android:color/white"/>    <TextView        android:id="@+id/delete"        android:layout_width="100dp"        android:layout_height="match_parent"        android:background="#FFFF0000"        android:gravity="center"        android:textColor="@android:color/white"        android:paddingRight="20dp"        android:text="删除" /></LinearLayout>


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表