按键实现ListView循环滚动、ListView item焦点处理(向下按键使ListView跳转到指定Item的一种思路)

public class MessageListView extends ListView {
    
    
    public MessageListView(Context context) {
        super(context);
    }

    public MessageListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MessageListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public MessageListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {

    //1、通过判断ListView当前被选择item的position,如果是最后一条就setSelection(0);可达到循环的目的
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            if (KeyEvent.KEYCODE_DPAD_DOWN == event.getKeyCode()) {
                setSelection(getNextPosition());
                return true;
            }
        }
        //KeyEvent.ACTION_UP

        return super.dispatchKeyEvent(event);
    }

    //2、down事件到dispatchKeyEvent时,找下一个否符合要求item的position,再setSelection()
    //   达到"略过一些item,跳到指定item的效果"
    private int getNextPosition() {

//        for->
//            getSelectedItemPosition()
//            getAdapter().getCount()
//            getAdapter().getItemViewType()
//            return 符合要求返回;

        return getSelectedItemPosition() + 2 < getAdapter().getCount()
                ? getSelectedItemPosition() + 2
                : getAdapter().getCount() - 1;
    }
}

猜你喜欢

转载自blog.csdn.net/yfbdxz/article/details/80369093
今日推荐