方法一(好方法)
public class TestListView extends ListView
{
float downX;
float downY;
float upX;
float upY;
private static final String TAG = "TestListView - gc";
boolean isGesture = false;
Context mContext;
public TestListView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
mContext = context;
}
public TestListView(Context context, AttributeSet attrs)
{
super(context, attrs);
mContext = context;
}
public TestListView(Context context)
{
super(context);
mContext = context;
}
@Override
public boolean performItemClick(View view, int position, long id) {
if(isGesture){
Log.d(TAG," ---------- performItemClick false" );
return true;
}else{
Log.d(TAG," ---------- performItemClick " );
return super.performItemClick(view, position, id);
}
}
@Override
public boolean onTouchEvent(MotionEvent ev)
{
if (ev.getAction() == MotionEvent.ACTION_DOWN)
{
isGesture = false;
downX = ev.getX();
downY = ev.getY();
}
if (ev.getAction() == MotionEvent.ACTION_UP)
{
upX = ev.getX();
upY = ev.getY();
int p1 = pointToPosition((int) downX, (int) downY);//获得position
int p2 = pointToPosition((int) upX, (int) upY);
if (p1 == p2 && Math.abs(downX - upX) > (getWidth()/10))
{
//进行滑动操作
Toast.makeText(mContext, "listview position : " + p1 + " p2 = " + p2, Toast.LENGTH_SHORT)
.show();
isGesture = true;
}
}
return super.onTouchEvent(ev);
}
}
方法二(不推荐)
重写每项的view
public class ItemView extends LinearLayout
{
private static final String TAG = "ItemView - gc";
GestureDetector gestureDetector;
int minVelocity = 500;
Context mContext;
boolean isGesture = false;
boolean isLongClick = false;
OnMyGestureListener onMyGestureListener;
public ItemView(Context context, AttributeSet attrs)
{
super(context, attrs);
init(context);
}
public ItemView(Context context)
{
super(context);
init(context);
}
public void init(Context context)
{
mContext = context;
setClickable(true);
setLongClickable(true);
gestureDetector = new GestureDetector(new GestureDetector.OnGestureListener()
{
@Override
public boolean onSingleTapUp(MotionEvent e)
{
Log.d(TAG, "onSingleTapUp");
return false;
}
@Override
public void onShowPress(MotionEvent e)
{
Log.d(TAG, "onShowPress");
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
{
Log.d(TAG, "onScroll distanceX : " + distanceX + " e2 -e1 = " + (e2.getX() - e1.getX()));
if (e2.getX() - e1.getX() > (getWidth() / 10) )//滑动多长距离才算滑动事件
{
if((!isGesture)&&(!isLongClick))
{
isGesture = true;
if(onMyGestureListener != null)
{
onMyGestureListener.onGesture(ItemView.this);
}
}
return true;
}
return false;
}
@Override
public void onLongPress(MotionEvent e)
{
Log.d(TAG, "onLongPress");
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
{
// Log.d(TAG, "onFling"+ " e2 -e1 = " + (e2.getX() - e1.getX()));
// if (e2.getX() - e1.getX() > (getWidth() / 5) && Math.abs(velocityX) > minVelocity)
// {
// Log.d(TAG, " ---------- Gesture " + title.getText());
// Toast.makeText(mContext, "Gesture : " + title.getText(), Toast.LENGTH_SHORT).show();
// isGesture = true;
// // new AlertDialog.Builder(mContext).setTitle("next").show();
// return true;
// }
return false;
}
@Override
public boolean onDown(MotionEvent e)
{
Log.d(TAG, "onDown");
isLongClick = false;
isGesture = false;
return false;
}
});
gestureDetector.setIsLongpressEnabled(true);
}
@Override//是否执行点击事件
public boolean performClick() {
if(isGesture||isLongClick){
return true;
}else{
return super.performClick();
}
}
@Override//是否执行长按事件
public boolean performLongClick()
{
isLongClick = true;
if(isGesture)
{
return true;
}
return super.performLongClick();
}
@Override
public boolean onTouchEvent(MotionEvent ev)
{
gestureDetector.onTouchEvent(ev);//启动滑动监听
return super.onTouchEvent(ev);
}
//给上层调用滑动监听
public void setOnGestureListener(OnMyGestureListener onMyGestureListener)
{
this.onMyGestureListener = onMyGestureListener;
}
interface OnMyGestureListener{
public void onGesture(View v);
}
}
在adapter中加入监听事件
public class TestAdapter extends BaseAdapter
{
public static final String TAG = "TestAdapter--gc";
ArrayList<Map<String, String>> array;
Context mContext;
OnClickListener onClickListener;
OnLongClickListener onLongClickListener;
OnMyGestureListener onMyGestureListener;
public TestAdapter(Context context, ArrayList<Map<String, String>> array)
{
this.array = array;
this.mContext = context;
onClickListener = new OnClickListener()
{
@Override
public void onClick(View v)
{
String text = (String) ((TextView)v.findViewById(R.id.textView1)).getText();
String tmp = (String) ((TextView)v.findViewById(R.id.textView2)).getText();
int position = Integer.valueOf(tmp.substring(tmp.lastIndexOf(":")+1));
Log.d(TAG,"onClick---position = " + position +" text : "+text);
Toast.makeText(mContext, "onClick---position = " + position +" text : "+text, Toast.LENGTH_SHORT).show();
array.remove(position);//删除这一项,用来测试position
notifyDataSetChanged();
}
};
onLongClickListener = new OnLongClickListener()
{
@Override
public boolean onLongClick(View v)
{
String text = (String) ((TextView)v.findViewById(R.id.textView1)).getText();
String tmp = (String) ((TextView)v.findViewById(R.id.textView2)).getText();
int position = Integer.valueOf(tmp.substring(tmp.lastIndexOf(":")+1));
Log.d(TAG,"onLongClick---position = " + position +" text : "+text);
Toast.makeText(mContext, "onLongClick---position = " + position +" text : "+text, Toast.LENGTH_SHORT).show();
return false;
}
};
onMyGestureListener = new OnMyGestureListener()
{
@Override
public void onGesture(View v)
{
String text = (String) ((TextView)v.findViewById(R.id.textView1)).getText();
String tmp = (String) ((TextView)v.findViewById(R.id.textView2)).getText();
int position = Integer.valueOf(tmp.substring(tmp.lastIndexOf(":")+1));
Log.d(TAG,"onGesture---position = " + position +" text : "+text);
Toast.makeText(mContext, "onGesture---position = " + position +" text : "+text, Toast.LENGTH_SHORT).show();
}
};
}
@Override
public int getCount()
{
return array.size();
}
@Override
public Object getItem(int position)
{
return array.get(position);
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
Holder holder;
if(convertView == null)
{
convertView = LayoutInflater.from(mContext).inflate(R.layout.item, null);
holder = new Holder();
holder.textView1 = (TextView) convertView.findViewById(R.id.textView1);
holder.textView2 = (TextView) convertView.findViewById(R.id.textView2);
convertView.setOnClickListener(onClickListener);//设置点击事件
convertView.setOnLongClickListener(onLongClickListener);//设置长按事件
((ItemView)convertView).setOnGestureListener(onMyGestureListener);//设置滑动事件
convertView.setTag(holder);
}else{
holder = (Holder) convertView.getTag();
}
holder.textView1.setText(array.get(position).get("title"));
holder.textView2.setText("position :" + position);//可以隐藏不显示
return convertView;
}
class Holder{
TextView textView1;
TextView textView2;
}
}