无法使用轨迹球点击列表视图中的视图

时间:2011-04-02 13:43:25

标签: android android-listview

我在行视图中有一个带有可点击按钮的列表视图,以及一个用于实现此列表的自定义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。

1 个答案:

答案 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中做错了,因为我不能看看为什么它应该以不同的方式起作用。