我在Android应用程序中工作,我希望在自定义Listview中的textview的setOnTouchListener中获取click事件。当我从setOnTouchListener返回true时,我得到了正确的click事件,但是ListView的滚动在textview的那一部分不起作用,因为我在ListView中已经有另一个click事件,我已经重写了ListView setOnTouchListener。
ListView setOnTouchListener
convertView.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
if (IsTablet) {
if (mDetailList.size() > 3)
v.getParent().requestDisallowInterceptTouchEvent(true);
} else {
if (mDetailList.size() > 2)
v.getParent().requestDisallowInterceptTouchEvent(true);
}
return false;
}
});
TextView setOnTouchListener
private float mDownX;
private float mDownY;
private final float SCROLL_THRESHOLD = 10;
private boolean isOnClick;
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mDownX = ev.getX();
mDownY = ev.getY();
isOnClick = true;
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
if (isOnClick) {
Log.i(LOG_TAG, "onClick ");
//TODO onClick code
}
break;
case MotionEvent.ACTION_MOVE:
if (isOnClick && (Math.abs(mDownX - ev.getX()) > SCROLL_THRESHOLD || Math.abs(mDownY - ev.getY()) > SCROLL_THRESHOLD)) {
Log.i(LOG_TAG, "movement detected");
isOnClick = false;
}
break;
default:
break;
}
return true;
}
有什么方法可以通过从TextView setOnTouchListener返回false来获取click事件,或者请建议我另一个解决此问题的方法。
答案 0 :(得分:2)
我为自己的问题找到了解决方案。
我没有覆盖ListView的setOnTouchListener,而是自定义了ListView并覆盖了自定义ListView中的onInterceptTouchEvent事件。
请参阅以下代码:
public class CustomListView extends ListView {
public CustomListView(Context context,
List<DetailSummaryMonth> detailSummaryMonths) {
super(context);
init(context);
}
public CustomListView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public CustomListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context context) {
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (getAdapter().getCount() > 3)
getParent().requestDisallowInterceptTouchEvent(true);
return super.onInterceptTouchEvent(ev);
}
}