您的位置:首页 > 移动开发 > Android开发

Android自定义View—HorizontalSlideDeleteListView

2015-06-15 15:29 435 查看
Android中可以用Listview的方式动态添加一个列表,像QQ、微信的好友列表都是用Listview动态添加。在QQ里面,有一栏是聊天记录,里面保存着正在跟你聊天的好友或一些推送的消息,这里有一个功能,就是我们可以选择将这个列表项删除,向左滑动,即出现一个删除的按钮,点击删除即可删除列表项,这种就是用到了HorizontalSlideDeleteListView。

首先要重写一个Listview类,并在xml中的Listview引用重写的类:

<com.example.horizontalslidelistview.HorizontalSlideDeleteListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>


在重写类之前,要先写一个Adapter。首先是获取屏幕宽度并初始化删除按钮事件与Item滑动事件:

public HorizontalSlideAdapter(Context context, List<String> objects) {
super(context, 0, objects);
// 获取屏幕宽度
Display defaultDisplay = ((Activity) context).getWindowManager()
.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
defaultDisplay.getMetrics(metrics);
mScreenWidth = metrics.widthPixels;   //屏幕宽度
mParams = new LinearLayout.LayoutParams(mScreenWidth,
LinearLayout.LayoutParams.MATCH_PARENT);  //布局参数,动态让HorizontalScrollView中的TextView宽度包裹父容器
// 初始化删除按钮事件与item滑动事件
mDelOnclickImpl = new DeleteButtonOnclickImpl();
mScrollImpl = new ScrollViewScrollImpl();
}


然后需要写一个方法,是实现Listview的滑动功能,并且是左右滑动,

/** HorizontalScrollView的滑动事件 */
private class ScrollViewScrollImpl implements OnTouchListener {
/** 记录开始时的坐标 */
private float startX = 0;
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// 如果有划出删除按钮的itemView,就让他滑回去并且锁定本次touch操作,解锁会在父组件的dispatchTouchEvent中进行
if (mScrollView != null) {
scrollView(mScrollView, HorizontalScrollView.FOCUS_LEFT);
mScrollView = null;
mLockOnTouch = true;
return true;
}
startX = event.getX();
break;
case MotionEvent.ACTION_UP:
HorizontalScrollView view = (HorizontalScrollView) v;
// 如果滑动了>50个像素,就显示出删除按钮
if (startX > event.getX() + 50) {
startX = 0;// 因为公用一个事件处理对象,防止错乱,还原startX值
scrollView(view, HorizontalScrollView.FOCUS_RIGHT);
mScrollView = view;
} else {
scrollView(view, HorizontalScrollView.FOCUS_LEFT);
}
break;
}
return false;
}
}
/** HorizontalScrollView左右滑动 */
public void scrollView(final HorizontalScrollView view, final int parameter) {
view.post(new Runnable() {
@Override
public void run() {
view.pageScroll(parameter);
}
});
}


然后再写一个方法,让这些列表项可删除,

/** 删除事件 */
private class DeleteButtonOnclickImpl implements OnClickListener {
@Override
public void onClick(View v) {
final ViewHolder holder = (ViewHolder) v.getTag();
Toast.makeText(getContext(), "删除第" + holder.position + "项",
Toast.LENGTH_SHORT).show();
Animation animation = AnimationUtils.loadAnimation(getContext(),
R.anim.anim_item_delete);
holder.scrollView.startAnimation(animation);
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
remove(getItem(holder.position));
}
});

}
}


这样就写好了Adapter,然后就可以重写Listview方法了,重写的方法继承Listview,Adapter引用重写的Adapter,下面是重写的方法:

public boolean dispatchTouchEvent(MotionEvent ev) {
if(mAdapter.mLockOnTouch){
if (ev.getAction() == MotionEvent.ACTION_DOWN
|| ev.getAction() == MotionEvent.ACTION_MOVE) {
//让滑动出删除按钮的那个itemView退回去
if (mAdapter.mScrollView != null) {
mAdapter.scrollView(mAdapter.mScrollView,
HorizontalScrollView.FOCUS_LEFT);
mAdapter.mScrollView = null;
}
return true;
}
if (ev.getAction() == MotionEvent.ACTION_UP) {
mAdapter.mLockOnTouch = false;
}
}
return super.dispatchTouchEvent(ev);
}
@Override
/** 设置adapter */
public void setAdapter(ListAdapter adapter) {
super.setAdapter(adapter);
mAdapter = (HorizontalSlideAdapter) adapter;
}


重写完Listview,现在xml中的Listview已经是具有删除功能的了,在主的activity中,创建一个列表即可,创建列表的方式跟普通的创建列表的方式一样,首先先创建一个ArrayList,将需要的内容放到ArrayList中,然后新建一个adapter,将arraylist中的内容放进adapter中,最后设置adapter即可,具体代码如下:

private ListView mListView;
private List<String> mDataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
mListView = (ListView) findViewById(R.id.listview);
HorizontalSlideAdapter adapter = new HorizontalSlideAdapter(this,
mDataList);
mListView.setAdapter(adapter);
}
private void initData() {
mDataList = new ArrayList<String>();
mDataList.add("11");
mDataList.add("11");
mDataList.add("11");
mDataList.add("11");
mDataList.add("11");
mDataList.add("11");
mDataList.add("11");
mDataList.add("11");
mDataList.add("11");
mDataList.add("11");
mDataList.add("11");
mDataList.add("11");
mDataList.add("11");
mDataList.add("11");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: