невозможно щелкнуть мышью в просмотре списка с помощью трекбола - PullRequest
0 голосов
/ 02 апреля 2011

У меня есть просмотр списка с нажимаемыми кнопками в представлениях строк и настраиваемый SimpleCursorAdapter для реализации этого списка. Несмотря на то, что onitemclicklistener не запускается при щелчке строки (см. здесь ), я реализовал прослушиватель, который работает при касании элемента строки:

 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, в том числе делая кнопку не фокусируемой, и некоторые другие методы здесь , но ничего не получилось. Как указывает эта ссылка, Google выполняет ее самостоятельно с помощью приложения журнала вызовов. Это, кажется, достигается с помощью ListActivities - я использую вкладку Activity с несколькими списками на одной вкладке.

1 Ответ

0 голосов
/ 03 апреля 2011

Мне удалось решить обе проблемы в итоге с TouchDelegate.Соответствующий код, который я использовал в моем пользовательском адаптере, приведен ниже.Я использовал TouchableDelegate в ImageView, так что я уверен, что большинство других объектов также будут работать.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, потому что не могувижу любую причину, по которой это должно работать по-другому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...