我在一个Android应用程序中工作,我想在自定义Listview内的textview的setOnTouchListener中获取click事件。当我从setOnTouchListener返回true时,我正确地获得了click事件,但ListView的滚动将无法在文本视图的该部分工作,因为该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事件,或者请建议我解决该问题的另一种方法。
最佳答案
我为自己的问题找到了解决方案。
我没有覆盖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);
}
}