Мне удалось решить обе проблемы в итоге с TouchDelegate.Соответствующий код, который я использовал в моем пользовательском адаптере, приведен ниже.Я использовал TouchableDelegate в ImageView, так что я уверен, что большинство других объектов также будут работать.TOUCH_RECT_EXPANSION - это просто постоянный параметр того, насколько вы хотите расширить ограничивающий прямоугольник.Также обратите внимание, что ваш пользовательский адаптер должен реализовывать View.OnTouchListener.
public View getView(int position, View convertView, ViewGroup parent) {
star = (ImageView) convertView.findViewById(R.id.liststar);
final View parentview = (View) star.getParent();
parentview.post( new Runnable() {
// Post in the parent's message queue to make sure the parent
// lays out its children before we call getHitRect()
public void run() {
final Rect r = new Rect();
star.getHitRect(r);
r.top -= TOUCH_RECT_EXPANSION;
r.bottom += TOUCH_RECT_EXPANSION;
r.left -= TOUCH_RECT_EXPANSION;
r.right += TOUCH_RECT_EXPANSION;
parentview.setTouchDelegate( new TouchDelegate(r,star) {
public boolean onTouchEvent(MotionEvent event) {
return true;
}
});
}
});
star.setOnTouchListener(this);
}
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
// do something here
}
return true;
}
}
У меня также были некоторые проблемы с onItemClickListener.В конце концов, они были решены с помощью отдельного пользовательского класса, который реализовал интерфейс OnItemClickListener, поэтому попробуйте, если у вас возникли проблемы, но, скорее всего, я что-то не так делал с классом onItemClickListener, потому что не могувижу любую причину, по которой это должно работать по-другому.