滚动时onTouch的自定义ListView问题

时间:2013-03-14 14:39:42

标签: android listview scroll

我有一个自定义ListView,其中我为每个列表项设置了OnTouchListener。当用户触摸该项目时,我会使用TransitionDrawableMotionEvent.ACTION_DOWN期间更改项目的背景颜色,并在MotionEvent.ACTION_UP期间恢复正常。

现在,当我滚动此列表时,在滚动操作开始时触摸的项目会更改背景颜色。我想避免这种行为。所以在滚动时我想禁用背景颜色的任何变化。有没有办法做到这一点?请参阅以下代码:

public class ListItemOnTouchListener implements OnTouchListener {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        Context mContext = getActivity().getApplicationContext();
        Resources res = mContext.getResources();
        switch (event.getAction()) {

        case MotionEvent.ACTION_DOWN:
            TransitionDrawable transitionDown = (TransitionDrawable) res
                .getDrawable(R.drawable.row_background_transition_down);
            v.setBackgroundDrawable(transitionDown);
            transitionDown.startTransition(350);
            Log.d(TAG, "ACTION_DOWN");
            return true;

        case MotionEvent.ACTION_UP:
            TransitionDrawable transitionUp = (TransitionDrawable) res
                    .getDrawable(R.drawable.row_background_transition_up);
            v.setBackgroundDrawable(transitionUp);
            transitionUp.startTransition(1000);
            // Get list view
            ListView listView = getListView();
            int position = listView.getPositionForView((LinearLayout) v.getParent());
            listView.performItemClick(v, position, 0);
            Log.d(TAG, "ACTION_UP");
            return true;

        case MotionEvent.ACTION_MOVE:
            Log.d(TAG, "ACTION_MOVE");
            break;

        case MotionEvent.ACTION_CANCEL:
            Log.d(TAG, "ACTION_CANCEL");
            v.setBackgroundResource(R.drawable.row_background_normal);
            break;
        }
        return false;
    }
}

2 个答案:

答案 0 :(得分:0)

当用户开始滚动时,您应该获得ACTION_CANCEL。抓住它并改回颜色。

答案 1 :(得分:0)

您可以实现onListItemClick(与触摸时相同),而不是触摸实现,然后在该方法上,您可以编写代码来更改触摸/单击的列表项的颜色。