lisstview侧滑删除

自定义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) {               //删除按钮点击事件            }        });


     
时间: 2024-08-18 03:39:38

lisstview侧滑删除的相关文章

自定义控件进阶02_侧滑删除,粘性控件

1 快速索引 细节问题: 1.1 把当前被选中的字母索引置为灰色,否则为白色 每一次在快速索引栏上的触摸事件都触发invalidate(),重走onDraw()方法 在onDraw()方法里,做判断,如果通过触摸事件计算的索引与绘制字母数组的索引一致时就更改画笔的颜色,(记得在触摸事件中如果手指抬起,就把计算的索引置为-1) 1.2 弹出吐司不太好看,弹出一个圆角的矩形框会好看一些(实际上就是一个圆角的TextView,平常隐藏,滑动的时候显示) 圆角:定义背景的xml文件,shape根节点,弧

Tableciew的基本属性和侧滑(删除 置顶 更多)

#import <UIKit/UIKit.h> //使用tableview必须遵循的 @interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> @property(strong,nonatomic) UITableView *tableview; //数据源 @property(strong,nonatomic) NSArray *students; @end #i

给UITableView的侧滑删除增加多个按钮

一. 需求: cell的侧滑删除默认只有一个删除按钮, 给侧滑添加多个按钮, '删除', '置顶', '更多'. 二. 实现说明: 1) 我们在使用一些应用的时候,在滑动一些联系人的某一行的时候,会出现删除.置顶.更多等等的按钮,在iOS8之前,我们都需要自己去实现.但是到了iOS8,系统已经写好了,只需要一个代理方法和一个类就搞定了 2) iOS8的协议多了一个方法,返回值是数组的tableView:editActionsForRowAtIndexPath:方法,我们可以在方法内部写好几个按钮

有关UITableViewCell的侧滑删除以及使用相关大神框架MGSwipeTableCell遇到的小问题

提起笔,却不知道从何写起了,今天一整天都耗费在了这个可能根本不算是问题的小问题上,至今仍有一种蛋蛋的忧桑..(噢,不是提笔,是键盘手T_T) 表格视图在项目中就像是每日的家常便饭,在cell上添加侧滑删除功能这种需求也是遍地可见.而就是这么一个家常菜却坑了我一天,可能我是真的闲的蛋疼吧,好吧,其实,讲道理还是我太菜,人艰不拆. 好了废话不多说,运用系统自带的API实现侧滑删除功能其实非常简单: //- (void)tableView:(UITableView *)tableView commit

iOS Tableview侧滑删除和移动cell的实现

慕课网上学习了tableview的使用,突然让我觉得iOS比android简单多了,可能是我的感觉吧.因为android实现list view侧拉删除,动态移动item过程还是稍微有点复杂的.但是iOS却只需要重写几个方法就可以实现了.我只能说iOS太神奇!我就跟着做了一下. 项目地址:Todo 看效果,UI还可以.先上storyboard结构图: navigate controller 实现一个导航栏.view controller 实现一个tableview,tableviewCell .

自定义UITableview自带侧滑删除按钮样式 by 徐

效果如下: 实现原理: 1.打开tableview自带的侧滑删除功能 核心代码: 1 -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 2 { 3 NSLog(@"只能响应这里的编辑方法..."); 4 } 2.自定义UITableViewCell

自定义tableViewCell的侧滑删除按钮

有时候客户会有一些特殊的要求,更改tableViewCell的侧滑删除按钮的样子就是其中之一,就像这样: 这个效果其实也不难,只需在自定义的cell里重写layoutSubviews方法就好,具体代码如下: //修改删除模式的样式 -(void)layoutSubviews { [super layoutSubviews]; for (UIView *subView in self.subviews) { if([subView isKindOfClass:NSClassFromString(@

【Android开源项目解析】RecyclerView侧滑删除粒子效果实现——初探Android开源粒子库 Leonids

前两天在微博上看到了这个侧滑删除的粒子效果,但是只有IOS的,所以心血来潮,写了个玩玩,下面简单介绍下实现的思路 项目简介 实现原理解析 代码实现 如何使用 更多参考 项目简介 先不废话,上效果图 项目地址:https://github.com/ZhaoKaiQiang/ParticleLayout 实现原理解析 其实看了那么多的关于侧滑删除的项目,再来思考这个问题,就so easy了! 咱们先分析下需求: - 侧滑手势检测 - 粒子跟手效果 - 删除状态判断 - 数据源刷新 ok,知道需求了,

【Android自定义ViewGroup】不一样的轮子,巧用类变量解决冲突,像IOS那样简单的使用侧滑删除,一个控件搞定Android item侧滑删除菜单。

================================================================================== [1 序言] 侧滑删除的轮子网上有很多,最初在github上看过一个,还是ListView时代,那是一个自定义ListView 实现侧滑删除的,当初就觉得这种做法不是最佳,万一我项目里又同时有自定义ListView的需求,会增加复杂度. 写这篇文章之前又通过毒度搜了一下,排名前几的CSDN文章,都是通过自定义ListVIew和Vie