前人未踏の領域へ アプリ開発編

Android, iOSアプリ開発に関する調査メモ置き場。ほとんどAndroid。はてなダイアリーから移行したため古い記事にはアプリ以外も含まれます。

SwipeRefreshLayoutとRecyclerViewを同時に使用すると挙動がおかしくなる場合の対策

課題

SwipeRefreshLayoutとRecyclerView, GridView, ListViewを同時に使用した際、リストの先頭まで戻らないうちにスワイプリフレッシュが実行されてしまう。

対策

参考のURLを元に制御する。
RecyclerView#setOnScrollListenerは既にDeprecatedとなっているため、
addOnScrollListenerを代わりに使用する。

final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
recyclerView.addOnScrollListener(new OnScrollListener()
    {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy)
        {
            super.onScrolled(recyclerView, dx, dy);
        }

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState)
        {
            //super.onScrollStateChanged(recyclerView, newState);
            int firstPos=linearLayoutManager.findFirstCompletelyVisibleItemPosition();
            if (firstPos>0)
            {
                swipeLayout.setEnabled(false);
            }
            else {
                swipeLayout.setEnabled(true);
            }
        }
    });

ListView,GridViewの場合

@Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            int firstPos = view.getFirstVisiblePosition();
            if (firstPos > 0) {
                mSwipeLayout.setEnabled(false);
            } else {
                mSwipeLayout.setEnabled(true);
            }
        }