Ontouch и onclick в элементе списка Android

Я хочу реализовать ontouch и onclicklistener в элементе списка Android.

Если я выбираю строку и щелкаю строку, нужно вызвать onclicklistener.

в то же время, если я прокручиваю строку списка слева и справа., нужно вызвать ontouchlistener в файле адаптера.

Как я могу сделать ? пожалуйста, дайте мне решение для этого?

здесь прокрутка работает нормально. но onclick не вызывается из моего кода.

В файле активности.,

class MyUpcomingTouchListener implements OnTouchListener
{
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        ViewHolder1 holder = (ViewHolder1) v.getTag(R.layout.listof_upcoming);
        int action = event.getAction();
        int position = (Integer) v.getTag();

        switch (action) {
        case MotionEvent.ACTION_DOWN:
            action_down_x = (int) event.getX();
            Log.d("action", "ACTION_DOWN - ");
            break;
        case MotionEvent.ACTION_MOVE:
            Log.d("action", "ACTION_MOVE - ");
            action_up_x = (int) event.getX();
            difference = action_down_x - action_up_x;
            break;
        case MotionEvent.ACTION_UP:
            Log.d("action", "ACTION_UP - ");
            calcuateupcomingDifference(holder, position);
            action_down_x = 0;
            action_up_x = 0;
            difference = 0;
            break;
        }
        return true;

    }

}
private void calcuateupcomingDifference(final ViewHolder1 holder, final int position) {
    runOnUiThread(new Runnable() {

        @Override
        public void run() {
            if (difference == 0) {
            }
            if (difference > 90) {
                holder.carudetails.setVisibility(View.GONE);
                holder.carucheckin.setVisibility(View.VISIBLE);
                holder.caruimage.setVisibility(View.VISIBLE);
                upcomingitems.get(position).setVisible(true);
                upcominglistAdapter.changeData(upcomingitems);
            }
            if (difference < -90) {
                holder.carudetails.setVisibility(View.VISIBLE);
                holder.carucheckin.setVisibility(View.GONE);
                holder.caruimage.setVisibility(View.GONE);
                upcomingitems.get(position).setVisible(true);
                upcominglistAdapter.changeData(upcomingitems);
            }
        }
    });
}

Из файла адаптера

 convertView.setOnTouchListener(mOnTouchListener);
 convertView.setOnClickListener(new  View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(TodayList.this,
                            DetailPage.class);
                startActivity(intent);
               }});

person Krishna Veni    schedule 08.10.2014    source источник
comment
вы хотите выполнить onClick для всего представления, представляющего строку списка, или для какого-либо специального элемента строки?   -  person Eddy    schedule 08.10.2014
comment
мне нужно выполнить функциональность onclick() в выбранной строке списка.   -  person Krishna Veni    schedule 08.10.2014
comment
используйте прослушиватель жестов в элементе просмотра списка, он обеспечит как прикосновение, так и прослушивание кликов.   -  person Meenal    schedule 08.10.2014


Ответы (2)


Чтобы выполнить onClick в строке ListView, вы должны использовать onItemClickListener, установить его с помощью list.setOnItemClickListener(). Если вы хотите предоставить это из адаптера, то будет лучше использовать GestureDetector.SimpleOnGestureListener, где у вас есть такие события, как прокрутка, двойное нажатие, одно нажатие. Также, если вы хотите выполнить onClick из кода, который у вас есть сейчас, вы можете попробовать:

private void calcuateupcomingDifference(final ViewHolder1 holder, final int position) {
runOnUiThread(new Runnable() {

    @Override 
    public void run() { 
         int absValue=Math.abs(difference);
        if (absValue >= 0 && absValue<=10) {
           holder.rowLayout.performOnClick(); 
        } 
        if (difference > 90) { 
            holder.carudetails.setVisibility(View.GONE);
            holder.carucheckin.setVisibility(View.VISIBLE);
            holder.caruimage.setVisibility(View.VISIBLE);
            upcomingitems.get(position).setVisible(true);
            upcominglistAdapter.changeData(upcomingitems); 
        } 
        if (difference < -90) { 
            holder.carudetails.setVisibility(View.VISIBLE);
            holder.carucheckin.setVisibility(View.GONE);
            holder.caruimage.setVisibility(View.GONE);
            upcomingitems.get(position).setVisible(true);
            upcominglistAdapter.changeData(upcomingitems); 
        } 
    } 
});
// DO not forget to add the rowLayout of converView to ViewHolder1 and to set rowLayout.setOnClickListener(); 
person Eddy    schedule 08.10.2014
comment
Я уже пробовал с вашей логикой. Это означает, что я пролистнул строку. Функция onclick, работающая только в то время, не работала. Функция ontouch не работала. Хорошо, я пойду другим путем GestureDetector.SimpleOnGestureListener - person Krishna Veni; 08.10.2014
comment
Сейчас я немного занят и не могу протестировать код и сказать на 100%, будет ли он работать или нет, но, по крайней мере, дал вам отправную точку. надеюсь, это поможет. Если найду время, проверю и отпишусь о результатах. - person Eddy; 08.10.2014

Простое решение:

Верните false в свой "ACTION_DOWN" в файл активности, как показано ниже:

class MyUpcomingTouchListener implements OnTouchListener
{
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        ...
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            ...
            return false;
        case MotionEvent.ACTION_MOVE:
            ...
            break;
        case MotionEvent.ACTION_UP:
            ...
            break;
        }
        return true;
    }
}

Объяснение:

onTouch всегда вызывается при нажатии на представление, так как это начальное состояние отправки событий в представление. Когда вы долго нажимаете на свое представление, это по-прежнему сначала вызывает onTouch, и, поскольку вы ранее возвращали true в onTouch (что означает, что вы использовали это событие, и оно не должно быть отправлено дальше), вы не получите вызов onLongPress. Что поможет вернуть false в onTouch.

Кредиты на этот ответ

person ChinoCarlo    schedule 22.10.2015