zoukankan      html  css  js  c++  java
  • listview侧滑删除

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


  • 相关阅读:
    Field client in com.rachel.web.ConsumerController required a bean of type 'org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient' that could not be found.
    MySQl创建用户和授权
    MySQL之索引原理与慢查询优化
    MySQL之视图、触发器、事务、存储过程、函数
    Navicat工具、pymysql模块
    MySQL之多表查询
    MySQL之单表查询
    MySQL行(记录)的详细操作
    MySQL的库表详细操作
    MySQL数据库初识
  • 原文地址:https://www.cnblogs.com/shenchanghui/p/5788725.html
Copyright © 2011-2022 走看看