仿QQ侧滑删除,自定义ListView

来源:互联网 发布:php多人游戏源码 编辑:程序博客网 时间:2024/05/22 05:30

废话不多说,直接代码

1.自定义QQListView:

public class QQListView 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 QQListView(Context context, AttributeSet attrs) {        this(context, attrs, 0);    }    public QQListView(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) / 2;                // 如果大于了删除按钮的宽度, 则最大为删除按钮的宽度                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 / 2) {            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_main.xml文件中声明QQListView而不是ListView了:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="${relativePackage}.${activityClass}" >    <com.example.qqdelete.QQListView          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" />  </RelativeLayout>

3.给QQListView准备好Item_layout布局

<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="80dp"          android:layout_height="match_parent"          android:background="#FFFF0000"          android:gravity="center"          android:paddingLeft="20dp"          android:textColor="@android:color/white"          android:paddingRight="20dp"          android:text="删除" />  </LinearLayout> 

4.在MainActivity中给 QQListView设置适配器:

public class MainActivity extends Activity {     private QQListView mListView;          private ArrayList<String> mData = new ArrayList<String>() {              {                  for(int i=0;i<50;i++) {                      add("hello world, hello android  " + i);                  }              }          };          @Override          protected void onCreate(Bundle savedInstanceState) {              super.onCreate(savedInstanceState);              setContentView(R.layout.activity_main);              mListView = (QQListView) findViewById(R.id.list);              mListView.setAdapter(new MyAdapter());              mListView.setOnItemClickListener(new 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_layout, 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 OnClickListener() {                      @Override                      public void onClick(View v) {                          mData.remove(pos);                          notifyDataSetChanged();                          mListView.turnToNormal();                      }                  });                  return convertView;              }          }  }

QQ侧滑就是如此SO easy,完结

0 0