无法在列表视图中点击视图与轨迹球
我有一个列表视图中可点击按钮的行视图,和一个自定义的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活动。
我设法通过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中做了错误的事情,因为我不能看到任何理由为什么应该工作不同。
实际上它似乎是TouchDelegate在我的情况下不是必需的。只需使用OnTouchListener而不是图标的OnClickListener就足以解决我的问题。所有触摸代表正在阻止我的行被点击在我的标签之一(奇怪)。谷歌 - 这个类是改进文档的主要候选者。 – 2011-04-12 20:53:20
作为一个快速更新 - 我设法通过使用适当的OnItemClickListener停止需要两次点击,将行布局中的所有项目设置为不可聚焦和不可点击,并使用TouchDelegate作为按钮。但是,我仍然不能选择跟踪球的行,如果使用OnItemClickListener,我应该可以这样做,对吗? – 2011-04-02 18:08:42