Added a custom snap helper in recyclerview

This commit is contained in:
CappielloAntonio 2021-08-09 12:00:56 +02:00
parent a3d01e1425
commit 3e9ae1bb6c
5 changed files with 72 additions and 6 deletions

View file

@ -0,0 +1,24 @@
package com.cappielloantonio.play.helper.recyclerview;
import android.view.View;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearSnapHelper;
import androidx.recyclerview.widget.RecyclerView;
public class CustomLinearSnapHelper extends LinearSnapHelper {
@Override
public View findSnapView(RecyclerView.LayoutManager layoutManager) {
if (layoutManager instanceof LinearLayoutManager) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
if (!needToDoSnap(linearLayoutManager)) {
return null;
}
}
return super.findSnapView(layoutManager);
}
public boolean needToDoSnap(LinearLayoutManager linearLayoutManager) {
return linearLayoutManager.findFirstCompletelyVisibleItemPosition() != 0 && linearLayoutManager.findLastCompletelyVisibleItemPosition() != linearLayoutManager.getItemCount() - 1;
}
}

View file

@ -23,6 +23,7 @@ import com.cappielloantonio.play.adapter.ArtistSimilarAdapter;
import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.adapter.SongHorizontalAdapter;
import com.cappielloantonio.play.databinding.FragmentArtistPageBinding; import com.cappielloantonio.play.databinding.FragmentArtistPageBinding;
import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper;
import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.interfaces.MediaCallback;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.repository.ArtistRepository; import com.cappielloantonio.play.repository.ArtistRepository;
@ -177,6 +178,9 @@ public class ArtistPageFragment extends Fragment {
if (bind != null) bind.artistPageAlbumsSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE); if (bind != null) bind.artistPageAlbumsSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE);
albumArtistPageOrSimilarAdapter.setItems(albums); albumArtistPageOrSimilarAdapter.setItems(albums);
}); });
CustomLinearSnapHelper albumSnapHelper = new CustomLinearSnapHelper();
albumSnapHelper.attachToRecyclerView(bind.albumsRecyclerView);
} }
private void initSimilarArtistsView() { private void initSimilarArtistsView() {
@ -189,5 +193,8 @@ public class ArtistPageFragment extends Fragment {
if (bind != null) bind.similarArtistSector.setVisibility(!artist.getSimilarArtists().isEmpty() ? View.VISIBLE : View.GONE); if (bind != null) bind.similarArtistSector.setVisibility(!artist.getSimilarArtists().isEmpty() ? View.VISIBLE : View.GONE);
artistSimilarAdapter.setItems(artist.getSimilarArtists()); artistSimilarAdapter.setItems(artist.getSimilarArtists());
}); });
CustomLinearSnapHelper similarArtistSnapHelper = new CustomLinearSnapHelper();
similarArtistSnapHelper.attachToRecyclerView(bind.similarArtistsRecyclerView);
} }
} }

View file

@ -12,7 +12,9 @@ import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider; import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearSnapHelper;
import androidx.recyclerview.widget.PagerSnapHelper; import androidx.recyclerview.widget.PagerSnapHelper;
import androidx.recyclerview.widget.SnapHelper;
import androidx.viewpager2.widget.ViewPager2; import androidx.viewpager2.widget.ViewPager2;
import com.cappielloantonio.play.R; import com.cappielloantonio.play.R;
@ -24,6 +26,7 @@ import com.cappielloantonio.play.adapter.RecentMusicAdapter;
import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.adapter.SongHorizontalAdapter;
import com.cappielloantonio.play.adapter.YearAdapter; import com.cappielloantonio.play.adapter.YearAdapter;
import com.cappielloantonio.play.databinding.FragmentHomeBinding; import com.cappielloantonio.play.databinding.FragmentHomeBinding;
import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper;
import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Album;
import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Artist;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
@ -165,6 +168,9 @@ public class HomeFragment extends Fragment {
mostPlayedAlbumAdapter.setItems(albums); mostPlayedAlbumAdapter.setItems(albums);
}); });
CustomLinearSnapHelper mostPlayedAlbumSnapHelper = new CustomLinearSnapHelper();
mostPlayedAlbumSnapHelper.attachToRecyclerView(bind.mostPlayedAlbumsRecyclerView);
} }
private void initRecentPlayedAlbumView() { private void initRecentPlayedAlbumView() {
@ -179,6 +185,9 @@ public class HomeFragment extends Fragment {
recentlyPlayedAlbumAdapter.setItems(albums); recentlyPlayedAlbumAdapter.setItems(albums);
}); });
CustomLinearSnapHelper recentPlayedAlbumSnapHelper = new CustomLinearSnapHelper();
recentPlayedAlbumSnapHelper.attachToRecyclerView(bind.recentlyPlayedAlbumsRecyclerView);
} }
private void initYearSongView() { private void initYearSongView() {
@ -199,6 +208,9 @@ public class HomeFragment extends Fragment {
yearAdapter.setItems(years); yearAdapter.setItems(years);
}); });
CustomLinearSnapHelper yearSnapHelper = new CustomLinearSnapHelper();
yearSnapHelper.attachToRecyclerView(bind.yearsRecyclerView);
} }
private void initStarredTracksView() { private void initStarredTracksView() {
@ -214,8 +226,8 @@ public class HomeFragment extends Fragment {
starredSongAdapter.setItems(songs); starredSongAdapter.setItems(songs);
}); });
PagerSnapHelper pagerSnapHelper = new PagerSnapHelper(); SnapHelper starredTrackSnapHelper = new PagerSnapHelper();
pagerSnapHelper.attachToRecyclerView(bind.starredTracksRecyclerView); starredTrackSnapHelper.attachToRecyclerView(bind.starredTracksRecyclerView);
} }
private void initStarredAlbumsView() { private void initStarredAlbumsView() {
@ -231,8 +243,8 @@ public class HomeFragment extends Fragment {
starredAlbumAdapter.setItems(albums); starredAlbumAdapter.setItems(albums);
}); });
PagerSnapHelper pagerSnapHelper = new PagerSnapHelper(); SnapHelper starredAlbumSnapHelper = new PagerSnapHelper();
pagerSnapHelper.attachToRecyclerView(bind.starredAlbumsRecyclerView); starredAlbumSnapHelper.attachToRecyclerView(bind.starredAlbumsRecyclerView);
} }
private void initStarredArtistsView() { private void initStarredArtistsView() {
@ -248,8 +260,8 @@ public class HomeFragment extends Fragment {
starredArtistAdapter.setItems(artists); starredArtistAdapter.setItems(artists);
}); });
PagerSnapHelper pagerSnapHelper = new PagerSnapHelper(); SnapHelper starredArtistSnapHelper = new PagerSnapHelper();
pagerSnapHelper.attachToRecyclerView(bind.starredArtistsRecyclerView); starredArtistSnapHelper.attachToRecyclerView(bind.starredArtistsRecyclerView);
} }
private void initRecentAddedAlbumView() { private void initRecentAddedAlbumView() {
@ -261,6 +273,9 @@ public class HomeFragment extends Fragment {
homeViewModel.getMostRecentlyAddedAlbums().observe(requireActivity(), albums -> { homeViewModel.getMostRecentlyAddedAlbums().observe(requireActivity(), albums -> {
recentlyAddedAlbumAdapter.setItems(albums); recentlyAddedAlbumAdapter.setItems(albums);
}); });
CustomLinearSnapHelper recentAddedAlbumSnapHelper = new CustomLinearSnapHelper();
recentAddedAlbumSnapHelper.attachToRecyclerView(bind.recentlyAddedAlbumsRecyclerView);
} }
private void initDownloadedSongView() { private void initDownloadedSongView() {
@ -275,6 +290,9 @@ public class HomeFragment extends Fragment {
dowanloadedMusicAdapter.setItems(MappingUtil.mapDownload(downloads)); dowanloadedMusicAdapter.setItems(MappingUtil.mapDownload(downloads));
}); });
CustomLinearSnapHelper downloadedSongSnapHelper = new CustomLinearSnapHelper();
downloadedSongSnapHelper.attachToRecyclerView(bind.downloadedTracksRecyclerView);
} }
private void setDiscoverSongSlideViewOffset(float pageOffset, float pageMargin) { private void setDiscoverSongSlideViewOffset(float pageOffset, float pageMargin) {

View file

@ -20,6 +20,7 @@ import com.cappielloantonio.play.adapter.ArtistAdapter;
import com.cappielloantonio.play.adapter.GenreAdapter; import com.cappielloantonio.play.adapter.GenreAdapter;
import com.cappielloantonio.play.adapter.PlaylistAdapter; import com.cappielloantonio.play.adapter.PlaylistAdapter;
import com.cappielloantonio.play.databinding.FragmentLibraryBinding; import com.cappielloantonio.play.databinding.FragmentLibraryBinding;
import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper;
import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.viewmodel.LibraryViewModel; import com.cappielloantonio.play.viewmodel.LibraryViewModel;
@ -90,6 +91,9 @@ public class LibraryFragment extends Fragment {
bind.libraryAlbumSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE); bind.libraryAlbumSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE);
albumAdapter.setItems(albums); albumAdapter.setItems(albums);
}); });
CustomLinearSnapHelper albumSnapHelper = new CustomLinearSnapHelper();
albumSnapHelper.attachToRecyclerView(bind.albumRecyclerView);
} }
private void initArtistView() { private void initArtistView() {
@ -103,6 +107,9 @@ public class LibraryFragment extends Fragment {
bind.libraryArtistSector.setVisibility(!artists.isEmpty() ? View.VISIBLE : View.GONE); bind.libraryArtistSector.setVisibility(!artists.isEmpty() ? View.VISIBLE : View.GONE);
artistAdapter.setItems(artists); artistAdapter.setItems(artists);
}); });
CustomLinearSnapHelper artistSnapHelper = new CustomLinearSnapHelper();
artistSnapHelper.attachToRecyclerView(bind.artistRecyclerView);
} }
private void initGenreView() { private void initGenreView() {
@ -122,6 +129,9 @@ public class LibraryFragment extends Fragment {
bind.libraryGenresSector.setVisibility(!genres.isEmpty() ? View.VISIBLE : View.GONE); bind.libraryGenresSector.setVisibility(!genres.isEmpty() ? View.VISIBLE : View.GONE);
genreAdapter.setItems(genres); genreAdapter.setItems(genres);
}); });
CustomLinearSnapHelper genreSnapHelper = new CustomLinearSnapHelper();
genreSnapHelper.attachToRecyclerView(bind.genreRecyclerView);
} }
private void initPlaylistSlideView() { private void initPlaylistSlideView() {

View file

@ -16,6 +16,7 @@ import com.cappielloantonio.play.adapter.AlbumAdapter;
import com.cappielloantonio.play.adapter.ArtistAdapter; import com.cappielloantonio.play.adapter.ArtistAdapter;
import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.adapter.SongHorizontalAdapter;
import com.cappielloantonio.play.databinding.FragmentSearchBinding; import com.cappielloantonio.play.databinding.FragmentSearchBinding;
import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper;
import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.util.MusicUtil; import com.cappielloantonio.play.util.MusicUtil;
import com.cappielloantonio.play.viewmodel.SearchViewModel; import com.cappielloantonio.play.viewmodel.SearchViewModel;
@ -82,12 +83,18 @@ public class SearchFragment extends Fragment {
albumAdapter = new AlbumAdapter(requireContext()); albumAdapter = new AlbumAdapter(requireContext());
bind.searchResultAlbumRecyclerView.setAdapter(albumAdapter); bind.searchResultAlbumRecyclerView.setAdapter(albumAdapter);
CustomLinearSnapHelper albumSnapHelper = new CustomLinearSnapHelper();
albumSnapHelper.attachToRecyclerView(bind.searchResultAlbumRecyclerView);
// Artists // Artists
bind.searchResultArtistRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.searchResultArtistRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false));
bind.searchResultArtistRecyclerView.setHasFixedSize(true); bind.searchResultArtistRecyclerView.setHasFixedSize(true);
artistAdapter = new ArtistAdapter(requireContext()); artistAdapter = new ArtistAdapter(requireContext());
bind.searchResultArtistRecyclerView.setAdapter(artistAdapter); bind.searchResultArtistRecyclerView.setAdapter(artistAdapter);
CustomLinearSnapHelper artistSnapHelper = new CustomLinearSnapHelper();
artistSnapHelper.attachToRecyclerView(bind.searchResultArtistRecyclerView);
} }
private void initSearchView() { private void initSearchView() {