我在行视图中有一个带有可点击按钮的列表视图,以及一个用于实现此列表的自定义SimpleCursorAdapter。尽管在单击行时没有触发onitemclicklistener(请参阅here),但我已经实现了一个在触摸行项时有效的侦听器:
public View getView(int position, View convertView, ViewGroup parent) {
.................................
convertView.setOnClickListener(new OnItemClickListener(position));
}
public class OnItemClickListener implements OnClickListener{
private int mPosition;
OnItemClickListener(int position){
mPosition = position;
}
public void onClick(View view) {
}
}
这有两个问题 - 触发onitemclick监听器需要两次触摸,可能是一个用于聚焦,一个用于触发,并且使用轨迹球选择行是不可能的。
我已经尝试了SO上列出的一些解决方法,包括使按钮无法调焦,以及其他一些方法here,但没有得到任何结果。正如该链接指出的那样,Google会使用通话记录应用程序自行完成。这似乎是通过ListActivities实现的 - 我在同一个选项卡中使用了带有多个列表的Tab Activity。
答案 0 :(得分:0)
我设法用TouchDelegate彻底解决了这两个问题。我在自定义适配器中使用的相关代码如下。我在ImageView上使用了TouchableDelegate,所以我很确定大多数其他对象也可以使用。 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中做错了,因为我不能看看为什么它应该以不同的方式起作用。