вторник, 8 декабря 2015 г.

Show / Hide FAB Button

Сегодня встретился с такой интересной штукой как FAB Button. Раньше как то пользовался только кастомной кнопкой из разных репозиториев, а тут как то получилось что проект создался сразу с ней, и я столкнулся с проблемой показа ее во время скролла, когда скролили в низ кнопка то появлялась то исчезала, когда возвращались на верх она вообще не появлялась, в общем куча проблем, заказчик истерит «как это так», все истерят, в общем всеобщий апокалипсис. По этому мне пришлось написать кастомный листвью для этого. Решение нашел на хабре, по этому кому надо тот найдет, эту статью, переношу решение сюда для удобства.

Заметка будет очень короткая, но по делу, возможно она спасет много жизней и нервов разработчикам и заказчикам (:

В общем ближе к сути. Нам нужно создать кастомный ListView, по этому создаем файл-класс ScrollDetectingListView и пишем в него следующее:

ScrollDetectingListView.java

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

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

    public ScrollDetectingListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    //нам нужен этот метод для определения скролла
    public int getVerticalScrollOffset() {
        return computeVerticalScrollOffset();
    }
}


Вот собственно и весь кастомный листвью. А дальше нам нужно просто переопределить в нашей разметке стандартный листвью на этот:

some_activity.xml
<some.package.name.ScrollDetectingListView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/listView">


И повесить на него листенера который будет отслеживать изменение позиции скролла. И все 

SomeActivity.java
ScrollDetectingListView listView = (ScrollDetectingListView) view.findViewById(R.id.listView);
istView.setOnScrollListener(new AbsListView.OnScrollListener() {
            private int mInitialScroll = 0;

            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) { }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                //получаем текущую позицию скролла
                int scrolledOffset = listView.getVerticalScrollOffset();
                if (scrolledOffset!=mInitialScroll) {
                    boolean scrollUp = (scrolledOffset - mInitialScroll) < 0;
                    mInitialScroll = scrolledOffset;
                    if (scrollUp) {
                        //показываем кнопку
                        fab.show();
                    } else {
                        //прячем
                        fab.hide();
                    }
                }
            }
        });


Вот собственно и все, теперь ваша кнопка будет прятаться каждый раз когда вы будете скроллить вниз, и появляться когда будете скроллить вверх. Красота! А главное просто.

Комментариев нет:

Отправить комментарий