Skip to content
This repository has been archived by the owner on Dec 28, 2022. It is now read-only.

Commit

Permalink
Fixed a crash when changing RecyclerView span count
Browse files Browse the repository at this point in the history
When switching from grid to list, and vise-versa, the SpanSizeLookup spanCount was not updated - so the expected spans for an item versus the actual span were out of sync, causing the item to span an incorrect number of columns, or the RV to crash.

Resolves #202
  • Loading branch information
timusus committed Oct 15, 2017
1 parent 4793bda commit 3e330e0
Show file tree
Hide file tree
Showing 5 changed files with 59 additions and 29 deletions.
Expand Up @@ -37,6 +37,7 @@
import com.simplecity.amp_library.utils.SortManager;
import com.simplecityapps.recycler_adapter.model.ViewModel;
import com.simplecityapps.recycler_adapter.recyclerview.RecyclerListener;
import com.simplecityapps.recycler_adapter.recyclerview.SpanSizeLookup;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;

import java.util.Collections;
Expand Down Expand Up @@ -70,7 +71,9 @@ interface AlbumArtistClickListener {

private GridLayoutManager layoutManager;

SectionedAdapter adapter;
private SectionedAdapter adapter;

private SpanSizeLookup spanSizeLookup;

private boolean sortOrderChanged = false;

Expand Down Expand Up @@ -120,15 +123,8 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
if (recyclerView == null) {
int spanCount = SettingsManager.getInstance().getArtistColumnCount(getResources());
layoutManager = new GridLayoutManager(getContext(), spanCount);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (adapter.items.get(position) instanceof EmptyView) {
return spanCount;
}
return 1;
}
});
spanSizeLookup = new SpanSizeLookup(adapter, spanCount);
layoutManager.setSpanSizeLookup(spanSizeLookup);

recyclerView = (FastScrollRecyclerView) inflater.inflate(R.layout.fragment_recycler, container, false);
recyclerView.setLayoutManager(layoutManager);
Expand Down Expand Up @@ -322,25 +318,25 @@ public boolean onOptionsItemSelected(MenuItem item) {
case R.id.view_as_list:
int viewType = ViewType.ARTIST_LIST;
SettingsManager.getInstance().setArtistDisplayType(viewType);
layoutManager.setSpanCount(getResources().getInteger(R.integer.list_num_columns));
setupListSpan();
updateViewType(viewType);
break;
case R.id.view_as_grid:
viewType = ViewType.ARTIST_GRID;
SettingsManager.getInstance().setArtistDisplayType(viewType);
layoutManager.setSpanCount(SettingsManager.getInstance().getArtistColumnCount(getResources()));
setupGridSpan();
updateViewType(viewType);
break;
case R.id.view_as_grid_card:
viewType = ViewType.ARTIST_CARD;
SettingsManager.getInstance().setArtistDisplayType(viewType);
layoutManager.setSpanCount(SettingsManager.getInstance().getArtistColumnCount(getResources()));
setupGridSpan();
updateViewType(viewType);
break;
case R.id.view_as_grid_palette:
viewType = ViewType.ARTIST_PALETTE;
SettingsManager.getInstance().setArtistDisplayType(viewType);
layoutManager.setSpanCount(SettingsManager.getInstance().getArtistColumnCount(getResources()));
setupGridSpan();
updateViewType(viewType);
break;
}
Expand All @@ -359,6 +355,18 @@ public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}

private void setupGridSpan() {
int spanCount = SettingsManager.getInstance().getArtistColumnCount(getResources());
spanSizeLookup.setSpanCount(spanCount);
layoutManager.setSpanCount(spanCount);
}

private void setupListSpan() {
int spanCount = getResources().getInteger(R.integer.list_num_columns);
spanSizeLookup.setSpanCount(spanCount);
layoutManager.setSpanCount(spanCount);
}

void updateViewType(@ViewType int viewType) {
Stream.of(adapter.items)
.filter(viewModel -> viewModel instanceof AlbumArtistView)
Expand Down
Expand Up @@ -43,6 +43,7 @@
import com.simplecity.amp_library.utils.SortManager;
import com.simplecityapps.recycler_adapter.model.ViewModel;
import com.simplecityapps.recycler_adapter.recyclerview.RecyclerListener;
import com.simplecityapps.recycler_adapter.recyclerview.SpanSizeLookup;
import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;

import java.util.Collections;
Expand Down Expand Up @@ -79,6 +80,8 @@ interface AlbumClickListener {

private SectionedAdapter adapter;

private SpanSizeLookup spanSizeLookup;

private boolean sortOrderChanged = false;

private ShuffleAlbumsView shuffleView;
Expand Down Expand Up @@ -132,16 +135,8 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
if (recyclerView == null) {
int spanCount = SettingsManager.getInstance().getAlbumColumnCount(getResources());
layoutManager = new GridLayoutManager(getContext(), spanCount);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (adapter.items.get(position) instanceof EmptyView
|| adapter.items.get(position) instanceof ShuffleAlbumsView) {
return spanCount;
}
return 1;
}
});
spanSizeLookup = new SpanSizeLookup(adapter, spanCount);
layoutManager.setSpanSizeLookup(spanSizeLookup);

recyclerView = (FastScrollRecyclerView) inflater.inflate(R.layout.fragment_recycler, container, false);
recyclerView.setLayoutManager(layoutManager);
Expand Down Expand Up @@ -333,25 +328,25 @@ public boolean onOptionsItemSelected(MenuItem item) {
case R.id.view_as_list:
int viewType = ViewType.ALBUM_LIST;
SettingsManager.getInstance().setAlbumDisplayType(viewType);
layoutManager.setSpanCount(getResources().getInteger(R.integer.list_num_columns));
setupListSpan();
updateViewType(viewType);
break;
case R.id.view_as_grid:
viewType = ViewType.ALBUM_GRID;
SettingsManager.getInstance().setAlbumDisplayType(viewType);
layoutManager.setSpanCount(SettingsManager.getInstance().getAlbumColumnCount(getResources()));
setupGridSpan();
updateViewType(viewType);
break;
case R.id.view_as_grid_card:
viewType = ViewType.ALBUM_CARD;
SettingsManager.getInstance().setAlbumDisplayType(viewType);
layoutManager.setSpanCount(SettingsManager.getInstance().getAlbumColumnCount(getResources()));
setupGridSpan();
updateViewType(viewType);
break;
case R.id.view_as_grid_palette:
viewType = ViewType.ALBUM_PALETTE;
SettingsManager.getInstance().setAlbumDisplayType(viewType);
layoutManager.setSpanCount(SettingsManager.getInstance().getAlbumColumnCount(getResources()));
setupGridSpan();
updateViewType(viewType);
break;
}
Expand All @@ -371,6 +366,18 @@ public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}

private void setupGridSpan() {
int spanCount = SettingsManager.getInstance().getAlbumColumnCount(getResources());
spanSizeLookup.setSpanCount(spanCount);
layoutManager.setSpanCount(spanCount);
}

private void setupListSpan() {
int spanCount = getResources().getInteger(R.integer.list_num_columns);
spanSizeLookup.setSpanCount(spanCount);
layoutManager.setSpanCount(spanCount);
}

void updateViewType(@ViewType int viewType) {
Stream.of(adapter.items)
.filter(viewModel -> viewModel instanceof AlbumView)
Expand Down
Expand Up @@ -153,6 +153,11 @@ public ViewHolder createViewHolder(ViewGroup parent) {
return new ViewHolder(createView(parent));
}

@Override
public int getSpanSize(int spanCount) {
return 1;
}

@Override
public String getSectionName() {
int sortOrder = SortManager.getInstance().getArtistsSortOrder();
Expand Down
Expand Up @@ -173,6 +173,11 @@ public ViewHolder createViewHolder(ViewGroup parent) {
return new ViewHolder(createView(parent));
}

@Override
public int getSpanSize(int spanCount) {
return 1;
}

@Override
public String getSectionName() {

Expand Down
Expand Up @@ -10,13 +10,18 @@
public class SpanSizeLookup extends GridLayoutManager.SpanSizeLookup {

private ViewModelAdapter viewModelAdapter;

private int spanCount;

public SpanSizeLookup(ViewModelAdapter viewModelAdapter, int spanCount) {
this.viewModelAdapter = viewModelAdapter;
this.spanCount = spanCount;
}

public void setSpanCount(int spanCount) {
this.spanCount = spanCount;
}

@Override
public int getSpanSize(int position) {

Expand All @@ -27,4 +32,4 @@ public int getSpanSize(int position) {

return 1;
}
}
}

0 comments on commit 3e330e0

Please sign in to comment.