【问题标题】:unable to click views in listview with trackball无法使用轨迹球单击列表视图中的视图
【发布时间】:2011-04-02 13:43:25
【问题描述】:

我在行视图中有一个带有可点击按钮的列表视图,以及一个自定义的 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,但没有得到任何结果。正如该链接所指出的,谷歌通过通话记录应用程序自行完成。不过,这似乎可以通过 ListActivities 实现 - 我正在使用一个选项卡活动,在同一个选项卡中包含多个列表。

【问题讨论】:

  • 作为一个快速更新 - 我已经设法通过使用适当的 OnItemClickListener 来停止两次点击的需要,将行布局中的所有项目设置为不可聚焦和不可点击,并使用按钮的 TouchDelegate。但是,我仍然无法选择带有轨迹球的行,如果正在使用 OnItemClickListener,我应该能够做到这一点,对吧?

标签: android android-listview


【解决方案1】:

我最终通过 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 似乎就足以解决我的问题。触摸代表所做的所有事情都是防止我的行在我的一个选项卡中被点击(奇怪)。 Google - 这个类是改进文档的主要候选者。
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
相关资源
最近更新 更多