Android listview: переход ячейки можно рисовать с помощью longclicklistener

У меня есть список с OnItemClickListener и OnItemLongClickListener.

В методе getView моего listadapter я устанавливаю представление с TransitionDrawable в качестве фона, затем я применяю к представлению OnTouchListener, чтобы, когда пользователь нажимает на представление и удерживает его, он видел, как происходит переход.

Проблема в том, что OnTouchListener должен возвращать true, иначе будет захвачено только событие движения ACTION_DOWN. Но, возвращая true, мои OnItemClickListener и OnItemLongClickListener не срабатывают.

Вопрос в том, как я могу показать анимацию TransitionDrawable И запустить события щелчка?

getView(..) адаптера массива:

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ...

    convertView.setOnTouchListener(touchListener);
    return convertView;
}

OnTouchListener:

OnTouchListener touchListener = new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {         
        TransitionDrawable transition = (TransitionDrawable)v.getBackground();

        if(event.getAction() == MotionEvent.ACTION_DOWN) {
            transition.startTransition(ViewConfiguration.getLongPressTimeout());
            return true;
        }
        else {
            transition.resetTransition();
        }

        return false;
    }
};

person ePeace    schedule 12.08.2013    source источник


Ответы (1)


В итоге я создал интерфейс для кликов и длинных кликов и обрабатывал их в onTouchListener:

private class TransitionView implements OnTouchListener {
    private Object object;
    TransitionDrawable transition;
    CountDownTimer timer;
    boolean running;
    View v;

    public TransitionView(Object object) {
        this.object = object;

        int time = ViewConfiguration.getLongPressTimeout();
        timer = new CountDownTimer(time, time) {

            @Override
            public void onTick(long millisUntilFinished) { }

            @Override
            public void onFinish() {
                running = false;
                transition.resetTransition();
                longClickListener.onItemLongClick(TransitionView.this.object, v);
            }
        };
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        this.v = v;

        transition = (TransitionDrawable)v.getBackground();

        if(event.getAction() == MotionEvent.ACTION_DOWN) {
            transition.startTransition(ViewConfiguration.getLongPressTimeout());
            timer.start();
            running = true;
            return true;
        }
        else if(event.getAction() == MotionEvent.ACTION_UP) {
            if(running) {
                timer.cancel();
                running = false;
                itemClickListener.onListItemClick(object, v);
            }
            transition.resetTransition();
        }
        else if(event.getAction() == MotionEvent.ACTION_CANCEL) {
            transition.resetTransition();
        }

        return false;
    }
}
person ePeace    schedule 13.08.2013