ListView、GridView等是不具有保存数据的能力的,其适配器也没有保存数据的能力。ListView、GridView显示的数据全部保存在适配器传的参数中,所以要改变显示的数据,只需改变适配器参数的值。
就像微信的滑动出现“删除”按钮,上图看吧:
(图片效果太差,见谅。)
当然解决了网上代码滑动删除和单击不兼容的问题。界面再丑,也要上源码。
先说说实现逻辑:在适配器中为每个item的convertView设置触控监听OnTouchListener实现。返回True,会覆盖item的单击事件;返回false,不会覆盖·。注意区分。代码就贴下关键代码吧:
public View getView(final int position, View view, ViewGroup arg2) {
ViewHolder viewHolder = null;
if (view == null) {
viewHolder = new ViewHolder();
view = LayoutInflater.from(mContext).inflate(R.layout.listview_textview, null);
viewHolder.tv1 = (TextView) view.findViewById(R.id.tv1);
viewHolder.tv2 = (TextView) view.findViewById(R.id.tv2);
viewHolder.tv3 = (TextView) view.findViewById(R.id.tv3);
viewHolder.btnDel = (Button) view.findViewById(R.id.del);
view.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) view.getTag();
}
//为每一个view项设置触控监听
view.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
final ViewHolder holder = (ViewHolder) v.getTag();
//当按下时处理
if (event.getAction() == MotionEvent.ACTION_DOWN) {
//获取按下时的x轴坐标
x = event.getX();
//判断之前是否出现了删除按钮如果存在就隐藏
if (curDel_btn != null) {
curDel_btn.setVisibility(View.GONE);
}
} else if (event.getAction() == MotionEvent.ACTION_UP) {// 松开处理
//获取松开时的x坐标
ux = event.getX();
//判断当前项中按钮控件不为空时
if (holder.btnDel != null) {
//按下和松开绝对值差当大于20时显示删除按钮,否则不显示
if (Math.abs(x - ux) > 20) {
holder.btnDel.setVisibility(View.VISIBLE);
curDel_btn = holder.btnDel;
}
}
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
} else {//其他模式
//设置背景为未选中正常状态
}
//注意此if必须有,否则会覆盖item的点击事件
if(Math.abs(x - ux) < 20){
return false;
}
return true;
}
});
viewHolder.tv1.setText(this.arrays1.get(position));
viewHolder.tv2.setText(this.arrays2.get(position));
viewHolder.tv3.setText(this.arrays3.get(position));
//为删除按钮添加监听事件,实现点击删除按钮时删除该项
viewHolder.btnDel.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(curDel_btn!=null)
curDel_btn.setVisibility(View.GONE);
arrays1.remove(position);
arrays2.remove(position);
arrays3.remove(position);
notifyDataSetChanged();
}
});
return view;
}