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.databinding.FragmentArtistPageBinding;
import com.cappielloantonio.play.glide.CustomGlideRequest;
import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper;
import com.cappielloantonio.play.interfaces.MediaCallback;
import com.cappielloantonio.play.model.Song;
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);
albumArtistPageOrSimilarAdapter.setItems(albums);
});
CustomLinearSnapHelper albumSnapHelper = new CustomLinearSnapHelper();
albumSnapHelper.attachToRecyclerView(bind.albumsRecyclerView);
}
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);
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.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.LinearSnapHelper;
import androidx.recyclerview.widget.PagerSnapHelper;
import androidx.recyclerview.widget.SnapHelper;
import androidx.viewpager2.widget.ViewPager2;
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.YearAdapter;
import com.cappielloantonio.play.databinding.FragmentHomeBinding;
import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper;
import com.cappielloantonio.play.model.Album;
import com.cappielloantonio.play.model.Artist;
import com.cappielloantonio.play.model.Song;
@ -165,6 +168,9 @@ public class HomeFragment extends Fragment {
mostPlayedAlbumAdapter.setItems(albums);
});
CustomLinearSnapHelper mostPlayedAlbumSnapHelper = new CustomLinearSnapHelper();
mostPlayedAlbumSnapHelper.attachToRecyclerView(bind.mostPlayedAlbumsRecyclerView);
}
private void initRecentPlayedAlbumView() {
@ -179,6 +185,9 @@ public class HomeFragment extends Fragment {
recentlyPlayedAlbumAdapter.setItems(albums);
});
CustomLinearSnapHelper recentPlayedAlbumSnapHelper = new CustomLinearSnapHelper();
recentPlayedAlbumSnapHelper.attachToRecyclerView(bind.recentlyPlayedAlbumsRecyclerView);
}
private void initYearSongView() {
@ -199,6 +208,9 @@ public class HomeFragment extends Fragment {
yearAdapter.setItems(years);
});
CustomLinearSnapHelper yearSnapHelper = new CustomLinearSnapHelper();
yearSnapHelper.attachToRecyclerView(bind.yearsRecyclerView);
}
private void initStarredTracksView() {
@ -214,8 +226,8 @@ public class HomeFragment extends Fragment {
starredSongAdapter.setItems(songs);
});
PagerSnapHelper pagerSnapHelper = new PagerSnapHelper();
pagerSnapHelper.attachToRecyclerView(bind.starredTracksRecyclerView);
SnapHelper starredTrackSnapHelper = new PagerSnapHelper();
starredTrackSnapHelper.attachToRecyclerView(bind.starredTracksRecyclerView);
}
private void initStarredAlbumsView() {
@ -231,8 +243,8 @@ public class HomeFragment extends Fragment {
starredAlbumAdapter.setItems(albums);
});
PagerSnapHelper pagerSnapHelper = new PagerSnapHelper();
pagerSnapHelper.attachToRecyclerView(bind.starredAlbumsRecyclerView);
SnapHelper starredAlbumSnapHelper = new PagerSnapHelper();
starredAlbumSnapHelper.attachToRecyclerView(bind.starredAlbumsRecyclerView);
}
private void initStarredArtistsView() {
@ -248,8 +260,8 @@ public class HomeFragment extends Fragment {
starredArtistAdapter.setItems(artists);
});
PagerSnapHelper pagerSnapHelper = new PagerSnapHelper();
pagerSnapHelper.attachToRecyclerView(bind.starredArtistsRecyclerView);
SnapHelper starredArtistSnapHelper = new PagerSnapHelper();
starredArtistSnapHelper.attachToRecyclerView(bind.starredArtistsRecyclerView);
}
private void initRecentAddedAlbumView() {
@ -261,6 +273,9 @@ public class HomeFragment extends Fragment {
homeViewModel.getMostRecentlyAddedAlbums().observe(requireActivity(), albums -> {
recentlyAddedAlbumAdapter.setItems(albums);
});
CustomLinearSnapHelper recentAddedAlbumSnapHelper = new CustomLinearSnapHelper();
recentAddedAlbumSnapHelper.attachToRecyclerView(bind.recentlyAddedAlbumsRecyclerView);
}
private void initDownloadedSongView() {
@ -275,6 +290,9 @@ public class HomeFragment extends Fragment {
dowanloadedMusicAdapter.setItems(MappingUtil.mapDownload(downloads));
});
CustomLinearSnapHelper downloadedSongSnapHelper = new CustomLinearSnapHelper();
downloadedSongSnapHelper.attachToRecyclerView(bind.downloadedTracksRecyclerView);
}
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.PlaylistAdapter;
import com.cappielloantonio.play.databinding.FragmentLibraryBinding;
import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper;
import com.cappielloantonio.play.model.Song;
import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.viewmodel.LibraryViewModel;
@ -90,6 +91,9 @@ public class LibraryFragment extends Fragment {
bind.libraryAlbumSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE);
albumAdapter.setItems(albums);
});
CustomLinearSnapHelper albumSnapHelper = new CustomLinearSnapHelper();
albumSnapHelper.attachToRecyclerView(bind.albumRecyclerView);
}
private void initArtistView() {
@ -103,6 +107,9 @@ public class LibraryFragment extends Fragment {
bind.libraryArtistSector.setVisibility(!artists.isEmpty() ? View.VISIBLE : View.GONE);
artistAdapter.setItems(artists);
});
CustomLinearSnapHelper artistSnapHelper = new CustomLinearSnapHelper();
artistSnapHelper.attachToRecyclerView(bind.artistRecyclerView);
}
private void initGenreView() {
@ -122,6 +129,9 @@ public class LibraryFragment extends Fragment {
bind.libraryGenresSector.setVisibility(!genres.isEmpty() ? View.VISIBLE : View.GONE);
genreAdapter.setItems(genres);
});
CustomLinearSnapHelper genreSnapHelper = new CustomLinearSnapHelper();
genreSnapHelper.attachToRecyclerView(bind.genreRecyclerView);
}
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.SongHorizontalAdapter;
import com.cappielloantonio.play.databinding.FragmentSearchBinding;
import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper;
import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.util.MusicUtil;
import com.cappielloantonio.play.viewmodel.SearchViewModel;
@ -82,12 +83,18 @@ public class SearchFragment extends Fragment {
albumAdapter = new AlbumAdapter(requireContext());
bind.searchResultAlbumRecyclerView.setAdapter(albumAdapter);
CustomLinearSnapHelper albumSnapHelper = new CustomLinearSnapHelper();
albumSnapHelper.attachToRecyclerView(bind.searchResultAlbumRecyclerView);
// Artists
bind.searchResultArtistRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false));
bind.searchResultArtistRecyclerView.setHasFixedSize(true);
artistAdapter = new ArtistAdapter(requireContext());
bind.searchResultArtistRecyclerView.setAdapter(artistAdapter);
CustomLinearSnapHelper artistSnapHelper = new CustomLinearSnapHelper();
artistSnapHelper.attachToRecyclerView(bind.searchResultArtistRecyclerView);
}
private void initSearchView() {