Listview onTouch в одном клике ListFragment не работает

Я использую фрагмент, который расширяет ListFragment, а затем использует ArrayAdapter для создания динамического списка пользовательских строк (все это работает отлично).

Что я сейчас пытаюсь сделать, так это реализовать событие onTouch, когда пользователь проводит пальцем по каждой строке слева направо, а затем что-то делает. Вся эта логика работает, единственная проблема заключается в том, что мне нужно выполнить событие onTouch, поскольку ACTION_UP, похоже, не вызывается в первый раз.

@Override
public void onListItemClick(ListView l, View v, final int position, long id) {
    super.onListItemClick(l, v, position, id);

    v.setOnTouchListener(new View.OnTouchListener() {
        int initialX = 0;
        final float slop = ViewConfiguration.get(getActivity()).getScaledTouchSlop() * 1.5f;

        @Override
        public boolean onTouch(final View v, MotionEvent event) {
            switch(event.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                    initialX = (int) event.getX();

                    return true;
                case MotionEvent.ACTION_UP:
                    // Do something here

                    return false;
            }

            return false;
        }
    });
}

Я возвращаю true из ACTION_DOWN, поэтому, насколько я понимаю, это должно указывать на событие onTouch, чтобы продолжить обработку событий касания, и в моем приведенном выше коде это будет ACTION_UP, когда пользователь убирает палец с экрана, не уверен, что мне здесь не хватает .

В дополнение к этому, если это вообще возможно, я также хотел бы привязать событие onClick к тому же представлению (не обязательно, так как уже есть обходной путь, если я могу работать выше).


person Raj    schedule 15.07.2015    source источник


Ответы (1)


Вы должны были использовать прослушиватель OnTouchListener для просмотра каждой строки listView, убедитесь, что вы возвращаете false в событии ACTION_UP.

Родительское представление получает обратный вызов только тогда, когда дочерние представления не использовали его. Поэтому, если в каждой строке представления списка есть onTouchListener, вы должны передать событие родительскому элементу, вернув false.

Надеюсь, это поможет.

person chandil03    schedule 15.07.2015
comment
Я уже использую onTouchListener для родителя списка, мне просто нужно, чтобы вся строка была доступна для кликов. Поэтому, как видите, я установил setOnTouchListener для самого представления, а не для списка. - person Raj; 15.07.2015
comment
Тогда как вы проводите каждую строку влево или вправо. Если вы не используете onTouchListener для каждой строки. - person chandil03; 15.07.2015
comment
Я использую его в представлении (строке). Мой список содержит несколько представлений, каждое представление представляет строку. Затем я присоединяю прослушиватель к представлению (строке). - person Raj; 15.07.2015
comment
Да, то, о чем я говорю, возвращает false для enent_down и event_up, но true для перемещения события для каждой строки. Здесь происходит то, что событие не заполняется родительским элементом, если вы используете event_down и up в прослушивателе строк. - person chandil03; 15.07.2015
comment
Попробовал это, и он не прошел, просто отладил его еще немного, основываясь на моем приведенном выше коде, что происходит, так это код action_down работает, что происходит при первом щелчке, ничего не подхватывается, затем при втором щелчке он работает как надо. - person Raj; 15.07.2015
comment
Только что решил проблему, когда я добавляю прослушиватель onItemClick, первый щелчок по существу устанавливает прослушиватель, а второй работает так, как должен. Итак, что мне нужно, чтобы установить прослушиватель в пользовательском ArrayAdaper, однако я не уверен, как я могу вызывать свои частные функции, которые находятся в моем фрагменте, из пользовательского ArrayAdapter? - person Raj; 15.07.2015
comment
Создайте интерфейс, содержащий метод, реализуйте во фрагменте и передайте в arrayAdapter и вызовите свой метод интерфейса везде, где вы хотите вызвать частный метод. - person chandil03; 15.07.2015
comment
Спасибо за вашу помощь, ваши комментарии помогли мне разработать исправление, переданное во фрагменте в мой ArrayAdapter, чтобы я мог напрямую обращаться ко всем методам в моем фрагменте, и теперь все работает. - person Raj; 15.07.2015