ListView滑动删除肯定大家都见过,比如QQ对话列表中就可以!
那么这个功能具体是怎么实现的呢,ListView展示数据和列表点击都很容易实现,但是如果是触摸,就没法了,
必须通过我们自己的努力来改写它来实现!先上效果图:
不知道是不是大家想要的效果,主页代码很简单:(MainActivity.java)
package cq.cake.dellistview;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private DelListView listView;
private List<String> mDatas;
private DelListViewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
initEvent();
}
private void initView() {
listView = (DelListView) findViewById(R.id.del_listview);
}
private void initData() {
mDatas = new ArrayList<String>();
for (int i = 'A'; i <= 'Z'; i++) {
mDatas.add("" + (char) i);
}
adapter = new DelListViewAdapter(this, mDatas);
listView.setAdapter(adapter);
}
private void initEvent() {
// 添加自定义listview的按钮单击事件,处理删除结果,和普通listview使用的唯一不同之处,
listView.setOnItemDeleteListener(new DelListView.OnItemDeleteListener() {
@Override
public void onItemDelete(int index) {
//删除当前数据集中对应数据,并刷新
mDatas.remove(index);
adapter.notifyDataSetChanged();
}
});
}
}
package cq.cake.dellistview;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.ListView;
/**
* My Application -- cq.cake.dellistview
* Created by Small Cake on 2016/1/29 10:36.
*/
public class DelListView extends ListView implements GestureDetector.OnGestureListener,
android.view.View.OnTouchListener {
public DelListView(Context context, AttributeSet attrs) {
super(context, attrs);
gestureDetector = new GestureDetector(getContext(), this);
setOnTouchListener(this);
}
/**
* 手势识别类
*/
private GestureDetector gestureDetector;
/**
* 滑动时出现的按钮
*/
private View btnDelete;
/**
* listview的每一个item的布局
*/
private ViewGroup viewGroup;
/**
* 选中的项
*/
private int selectedItem;
/**
* 是否已经显示删除按钮
*/
private boolean isDeleteShow;
/**
* 点击删除按钮时删除每一行的事件监听器
*/
private OnItemDeleteListener onItemDeleteListener;
public void setOnItemDeleteListener(
OnItemDeleteListener onItemDeleteListener) {
this.onItemDeleteListener = onItemDeleteListener;
}
/**
* @类名称: OnItemDeleteListener
* @描述: 删除按钮监听器
*/
public interface OnItemDeleteListener {
void onItemDelete(int selectedItem);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// 得到当前触摸的条目
selectedItem = pointToPosition((int) event.getX(), (int) event.getY());
// 如果删除按钮已经显示,那么隐藏按钮,异常按钮在当前位置的绘制
if (isDeleteShow) {
btnHide(btnDelete);
viewGroup.removeView(btnDelete);
btnDelete = null;
isDeleteShow = false;
return false;
} else {
// 如果按钮没显示,则触发手势事件
// 由此去触发GestureDetector的事件,可以查看其源码得知,onTouchEvent中进行了手势判断,调用onFling
return gestureDetector.onTouchEvent(event);
}
}
@Override
public boolean onDown(MotionEvent e) {
// 得到当前触摸的条目
if (!isDeleteShow) {
selectedItem = pointToPosition((int) e.getX(), (int) e.getY());
}
return true;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
// 如果删除按钮没有显示,并且手势滑动符合我们的条件
// 此处可以根据需要进行手势滑动的判断,如限制左滑还是右滑,我这里是左滑右滑都可以
Log.e("velocityX>>>"," "+Math.abs(velocityX)+" ");
Log.e("velocityY>>>"," "+Math.abs(velocityY)+" ");
if (!isDeleteShow && Math.abs(velocityX) > Math.abs(velocityY)) {
// 在当前布局上,动态添加我们的删除按钮,设置按钮的各种参数、事件,按钮的点击事件响应我们的删除项监听器
btnDelete = LayoutInflater.from(getContext()).inflate(R.layout.layout_button, null);
/**
* 删除按钮的点击事件
*/
btnDelete.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// btnHide(btnDelete);
viewGroup.removeView(btnDelete);
btnDelete = null;
isDeleteShow = false;
/**
* 把参数传入接口,进行回调
*/
onItemDeleteListener.onItemDelete(selectedItem);
}
});
viewGroup = (ViewGroup) getChildAt(selectedItem - getFirstVisiblePosition());
viewGroup.addView(btnDelete);
btnShow(btnDelete);
isDeleteShow = true;
} else {
setOnTouchListener(this);
}
return false;
}
/**
* @方法名称: btnShow
* @描述: 按钮显示时的动画
*/
private void btnShow(View v) {
v.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.btn_show));
}
/**
* @方法名称: btnHide
* @描述: 按钮隐藏时的动画
*/
private void btnHide(View v) {
v.startAnimation(AnimationUtils.loadAnimation(getContext(), R.anim.btn_hide));
}
}
有了这两个主要文件,相信大家看看就能做出来同样的效果了,简单的布局和动画就不贴了,大家可以自己改造!
同时源码奉上,希望对需要的同学有所帮助:ListView滑动删除
243

被折叠的 条评论
为什么被折叠?



