无法在列表视图中点击视图与轨迹球

问题描述:

我有一个列表视图中可点击按钮的行视图,和一个自定义的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活动。

+0

作为一个快速更新 - 我设法通过使用适当的OnItemClickListener停止需要两次点击,将行布局中的所有项目设置为不可聚焦和不可点击,并使用TouchDelegate作为按钮。但是,我仍然不能选择跟踪球的行,如果使用OnItemClickListener,我应该可以这样做,对吗? – 2011-04-02 18:08:42

我设法通过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中做了错误的事情,因为我不能看到任何理由为什么应该工作不同。

+0

实际上它似乎是TouchDelegate在我的情况下不是必需的。只需使用OnTouchListener而不是图标的OnClickListener就足以解决我的问题。所有触摸代表正在阻止我的行被点击在我的标签之一(奇怪)。谷歌 - 这个类是改进文档的主要候选者。 – 2011-04-12 20:53:20