要实现类似QQ的ListView左滑删除其实可以给ListView中每个条目外面添加一个可以处理左滑事件的View即可。该控件需要重写onInterceptTouchEvent方法和onTouchEvent方法,具体处理过程参考 安卓事件分发机制,确定由自定义控件处理触摸事件后需要调用requestDisallowInterceptTouchEvent来防止ListView响应事件。
下面介绍如何通过代理来实现。
public class SlideListView extends ListView {
public SlideListView(Context context) {
super(context);
}
//调用ListView 的 setAdapter时,在该方法中new 一个Adapter,然后调用父类的setAdapter,
//当ListView首次设置Adapter时或滚动时会调用该方法中new的Adapter,该Adapter内部每个被重写的方法又返回了用户传进来的Adapter中对应的方法
//getView中对view进行了拦截,若没添加过支持左滑的控件就添加后返回,否则直接返回
@Override
public void setAdapter(final ListAdapter adapter) {
//代理
BaseAdapter baseAdapter=new BaseAdapter() {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//SlideContainerView是一个处理左滑事件的父控件,用来包裹每一个条目
View view=adapter.getView(position, convertView, parent);
if (view instanceof SlideContainerView) {//如果控件是SlideContainerView说明该条目已经被添加过处理左滑的控件,直接返回该控件即可
return view;
}
//给该条目添加处理左滑的父控件
return new SlideContainerView(getContext(),view);
}
@Override
public long getItemId(int position) {
return adapter.getItemId(position);
}
@Override
public Object getItem(int position) {
return adapter.getItem(position);
}
@Override
public int getCount() {
return adapter.getCount();
}
};
super.setAdapter(baseAdapter);
}
}